我有一个数据结构,可以归结为:
class StylesheetUserPreferencesImpl {
long id;
String desc;
Map<String, Map<String, String>> nodeAttributes;
}为了让JPA2注释更合理一点,我创建了一个小类来表示内部类:
class LayoutAttributeImpl {
String nodeId;
private Map<String, String> attributes;
}这给了我:
class StylesheetUserPreferencesImpl {
long id;
String desc;
Map<String, LayoutAttributeImpl> nodeAttributes;
}最后,我想要的是一个如下所示的表结构:
SS_USER_PREFS
PREFS_ID
DESC
SS_LAYOUT_ATTRS
PREFS_ID
NODE_ID
NAME
VALUE不过,我不太确定如何在JPA中映射这一点。似乎我希望LayoutAttributeImpl是可嵌入的,但据我所知,可嵌入的对象不能包含集合。我现在让它工作,让LayoutAttributeImpl充当一个成熟的@Entity,但这给了我一个我真的不需要的额外的表。
发布于 2011-03-09 06:58:20
不如这样吧:
class StylesheetUserPreferencesImpl {
long id;
String desc;
Map<AttributeCoordinate, String> attributes;
}
class AttributeCoordinate {
String nodeID;
String prefID;
}非常直接地映射到您想要的表上- Embeddables可以是map中的键,对吧?如果您总是同时查找具有节点和首选项ID的属性,那么可以将这种有点奇怪的对象结构隐藏在getter中。
如果您希望能够操作单个节点属性的整个映射,那么您就遇到了一个问题。您可以编写一个Map实现来伪造它:它包含一个节点ID,并通过将键视为首选项ID来处理查找,然后使用这两个ID对进行查找。
这有什么意义吗?我刚吃了很多薄煎饼,可能我的思绪不太清楚。
https://stackoverflow.com/questions/5235394
复制相似问题