我有一个xml文件,其中我有一些键值对。我想以键值对的形式存储它们
<parent>
<key1> value </1key>
<key1> value </1key>
<key1> value </1key>
<key1> value </1key>
...
<key1> value </1key>
</parent>
现在我不知道有多少关键值会提前来自xml。如何将它映射到hibernate对象? 我可以在
中的表格中找到它primaryKey parentId key value
1 1 k1 val
2 1 k2 val
3 1 k3 val
4 2 k1 val
5 2 k2 val
6 3 k3 val
如何将其映射到hibernate对象? 我想要以下结构 class Parent { int parentId; 字符串父名称 KeyValue keyval; //我如何建模呢?
}
AM使用netbeans IDE。
答案 0 :(得分:7)
您确实可以使用地图:
public class Parent {
@Id
private Integer id;
@OneToMany(mappedBy = "parent")
@MapKey(name = "key")
private Map<String, KeyValuePair> keyValuePairs;
}
public class KeyValuePair {
@Id
private Integer id;
@ManyToOne
@JoinColumn(name = "parent_id")
private Parent parent;
@Column(name = "key")
private String key;
@Column(name = "value")
private String value;
}
您还应该对[parent_id - key]
。
答案 1 :(得分:4)
您也可以直接映射到表而无需创建KeyValuePair类
对于具有存储在MY_MAP_TABLE中的键值对的map属性,并将其定义为名为“settings”的属性:
定义属性:
@ElementCollection (fetch=FetchType.EAGER)
@CollectionTable(name="MY_MAP_TABLE" , joinColumns=@JoinColumn(name="ID"))
@MapKeyColumn(name="name")
@Column(name="value")
public Map<String, String> getSettings() {
return settings;
}
用于存储地图的表格:
CREATE TABLE MY_MAP_TABLE (
ID NUMBER not null REFERENCES MY_PARENT_TABLE(ID),
NAME VARCHAR2(256) not null,
VALUE VARCHAR2(256) not null,
PRIMARY KEY (ID , NAME)
);
答案 2 :(得分:3)
如果KeyValuePair完全由Parent私有,那么更好的方法是:
@Entity
public class Parent {
@Id
@GeneratedValue
private long id;
@ElementCollection(fetch=FetchType.EAGER)
@MapKeyColumn(name="key")
@CollectionTable(name="keyvaluepair", joinColumns= @JoinColumn(name="id"))
private Map<String, KeyValuePair> keyValuePairMap =
new HashMap<String, KeyValuePair>();
//getter and setter methods
}
@Embeddable
public class KeyValuePair {
//no need of declaring key
//key column will be created by MapKeyColumn
private String value;
//getter and setter methods
}
在这种方法中,KeyValuePair始终与父级一起保持,合并,删除。
参见: