繁体   English   中英

如何将地图与休眠注释一起使用

[英]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对象时,我将键设置为xy ,在保存FooPerson的实体时不使用这些键,这是否意味着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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM