2014-06-26 108 views
0

我是JPA Hibernate实现的新手,我试图理解EntityManager.merge是如何工作的。
我有两个班,@​​ManyToOne关系如下列情形JPA合并外键丢失

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房产的 - 在未装载的类并没有打开会话中查看。
当试图保存(合并)在后端的变化:

entityManager.merge(b); //the object "b" created from view has "a" set to null 

在B表的外键关系数据库(参考表A)是失去了 - 设置为null;
这不是我想要保持关系和合并 - 保存在GUI中进行的更改,而不会丢失多对一的关系
也许我所期待的是不可能的,我需要做的是:

dbB b = entityManager.find(B.class, id); 
dbB.setName(b.getName()); 
dbB.set........ 
entityManager.merge(dbB); 

回答

1

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

我想保持的关系,合并保存在GUI中所做的更改到对象B与出失去了很多一对一的关系

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