JPA合并外键丢失了

时间:2014-06-26 14:19:14

标签: java mysql hibernate jpa

我是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);

1 个答案:

答案 0 :(得分:1)

如果在entityManager.merge(b);b.a关系为空,merge将删除外键。这是因为值null并不意味着应该忽略引用,但应该删除引用(即不再有引用)。

  

我想保持关系并合并 - 将GUI中所做的更改保存到对象B而不会丢失多对一关系

一种选择是从数据库中读取实体,并将a初始化为惰性代理并将其传递给gui。在该过程中,实体很可能会被分离,因此您需要在保存期间合并它。但是,由于a在这种情况下不会为空,因此引用不应丢失。