2014-06-26 181 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在這種情況下不會爲空,所以引用不應該丟失。