我是JPA Hibernate实现的新手,我正在尝试了解EntityManager.merge的工作原理。
我有两个具有@ManyToOne关系的类的情况,例如
class A{
private String name;
........
get...
set...
}
class B{
private String name;
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.MERGE)
private A a;
........
get...
set...
}
我有GUI,你只能查看和更改B属性 - 没有加载A类,视图中没有Open Session。
尝试在后端保存(合并)更改时:
entityManager.merge(b); //the object "b" created from view has "a" set to null
在表B的数据库中,外键关系(引用表A)丢失 - 设置为空;
这不是我想要保持关系和合并的结果 - 将GUI中所做的更改保存到对象B而不会失去多对多关系
也许我期待的是不可能的,我需要做的是:
dbB b = entityManager.find(B.class, id);
dbB.setName(b.getName());
dbB.set........
entityManager.merge(dbB);
答案 0 :(得分:1)
如果在entityManager.merge(b);
中b.a
关系为空,merge
将删除外键。这是因为值null
并不意味着应该忽略引用,但应该删除引用(即不再有引用)。
我想保持关系并合并 - 将GUI中所做的更改保存到对象B而不会丢失多对一关系
一种选择是从数据库中读取实体,并将a
初始化为惰性代理并将其传递给gui。在该过程中,实体很可能会被分离,因此您需要在保存期间合并它。但是,由于a
在这种情况下不会为空,因此引用不应丢失。