我遇到了一些,呃,非正统的设计,我不太确定如何处理它。我试图映射的表如下所示:
TABLE example {
ID INT,
CATEGORY VARCHAR,
PROPERTY VARCHAR,
VALUE VARCHAR);
单个id可以有几行(显然,不是主键)。例如,它可能如下所示:
# ID CATEGORY PROPERTY VALUE
1 general_info name order 1
1 general_info date 1/1/2009
...
每个ID可能有几个不同的类别。属性名称对于任何给定的(id,类别)组合都是唯一的。
(编辑) ID字段是不同表中对象的外键。我需要能够从这些对象中获取存储在这个表中的各种属性,只使用ID字段。如果组合键是可行的,那么如何将它们链接起来呢?
(EDIT2)我还认为您在这里遗漏的细节是,第一列中具有相同ID的所有数据在概念上属于同一对象。我不希望每个(ID,类别)组合都有一个单独的实例。
显然,这并不是非常规范化。最坏的情况是,我设置了一些额外的表,这些表被标准化并复制所有内容,但我想知道是否有人能提出一个明智的方法,将这些信息直接放入hibernate支持的对象中?如果需要,可以放在某种字符串属性包中。
顺便说一下,我使用的是hibernate注释。
发布于 2010-08-29 11:08:22
由于该ID是另一个表的外键(让我们将该表称为“容器”),因此可以将其映射为具有组合键的Map。
示例:
public class Container {
private int id;
private Map<Key,String> values = new HashMap<Key,String>();
public String getValue(String category, String property) {
return values.get(new Key(category, property));
}
public void setValue(String category, String property, String value) {
values.put(new Key(category, property), value);
}
public static class Key {
private String category;
private String property;
public Key(String cat, String prop) {
category = cat;
property = prop;
}
public String getCategory() {
return category;
}
public String getProperty() {
return property;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Key)) {
return false;
}
Key k = (Key)obj;
return category.equals(k.category) && property.equals(k.property);
}
@Override
public int hashCode() {
return 37*category.hashCode() + property.hashCode();
}
}
}
映射:
<class name="Container" table="container">
<id column="ID" name="id">
<generator class="native"/>
</id>
<map cascade="all-delete-orphan" name="values" table="example">
<key column="ID"/>
<composite-map-key class="Container$Key">
<key-property name="category" type="string" column="CATEGORY"/>
<key-property name="property" type="string" column="PROPERTY"/>
</composite-map-key>
<element type="string" column="VALUE"/>
</map>
</class>
发布于 2010-08-27 15:18:52
使用具有ID、类别和属性的组合键。有关如何实现此功能的示例,请参阅Multiple key in hibernate how to?和JPA - Entity design problem (@EmbeddedId是关键!)
https://stackoverflow.com/questions/3585540
复制