[英]How to use Map with hibernate annotations
我试图通过编写示例程序来了解休眠状态下Map的用法,但是我没有使用Map。 这是我正在尝试做的事情:
Foo.java
@Entity
public class Foo {
@Id
@GeneratedValue
private int id;
@OneToMany(cascade = CascadeType.ALL)
@MapKey(name = "name")
private Map<String, Person> persons = new HashMap<String, Person>();
// Setter & Getters
}
Person.java
@Entity
public class Person {
@Id
@GeneratedValue
private int id;
private String name;
// Setters & Getters
}
现在这是我的示例程序:
public static void main(String[] args) {
session.beginTransaction();
Foo f = new Foo();
Person p1 = new Person("a");
Person p2 = new Person("b");
Map<String, Person> persons = new HashMap<String, Person>();
persons.put("x", p1);
persons.put("y", p2);
f.setPersons(persons);
int id = (Integer) session.save(f);
session.getTransaction().commit();
listFoo(id);
}
private static void listFoo(Integer id) {
Session session = //get the session;
session.beginTransaction();
Foo foo = (Foo) session.get(Foo.class, id);
System.out.println("foo.getId()="+foo.getId());
Map<String,Person> persons = foo.getPersons();
for (String key : persons.keySet()) {
System.out.println("key="+key+" , value = "+persons.get(key).getName());
}
}
这是输出:
foo.getId()=1
key=a , value = a
key=b , value = b
在此程序中,在保存Foo
对象时,我将键设置为x
& y
,在保存Foo
& Person
的实体时不使用这些键,这是否意味着HashMap键将被忽略,因此我可以给它? 你能澄清一下吗?
通过使用@MapKey
您可以通知JPA,您希望将关系表示为map,而不是简单的集合(例如列表或一组人),该关系的键是实体属性之一,而该属性包含在MapKey批注中。
您用MapKey(name)
注释了该关系,并且JPA将人员保留在其name值下。 您添加了人a和b,因此键为a,b。 将Foo保存到数据库后,输入的x,y键将丢失。 DB中没有多余的列可存储这些值,仅存储“人名”。 检索Foo实体后,将提取所有Person实体,然后使用其名称字段作为键将其放置在地图中,因此您的x,y值将替换为实际的名称值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.