我有一个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对象?我想要下面的结构类父母{int parentId;字符串父名称KeyValue;//如何建模?
}
使用netbeans IDE
您确实可以使用映射:
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]
有一个唯一的约束。
您也可以直接映射到表,而无需创建KeyValuePair类
对于键值对存储在MY_MAP_TABLE中并定义为名为'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)
);
如果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总是被持久化、合并、删除。
参考:
- http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection
- http://hwellmann.blogspot.in/2010/07/jpa-20-mapping-map.html