2014-02-27 145 views
0

有一種方法可以使用@jointable映射多對多關係,並避免可聯接行的自動級聯?JPA(with Hibernate)@ManyToMany @JoinTable關係級聯

@ManyToMany註釋的級聯屬性是創建/合併/刪除相關的實體(不是jointable行)和@JoinTable插入/更新的joincolumns/inversejoincolumns屬性被忽略,當我堅持/合併附屬實體的關係。

例:User(所有者)×Role(的mappedBy)的關係,當我合併與角色的收集空的用戶,表USER_ROLE的所有行被該用戶刪除。

韓國社交協會提前。


這是我的觀點:

爲了使問題的問題簡單,讓我們假設我有三個屬性的用戶實體:ID,電子郵件和一組角色(所有者,@ManyToMany的,@JoinTable )。 我會合並有至少一個或多個角色的用戶實體,沒有找到它通過的EntityManager:

User user = new User(); //detached 
user.setId(1L); // for merge 
user.setEmail("[email protected]"); 

entityManager.merge(user); 

在數據庫中的結果是:

UPDATE user... /*ok!*/ 
delete from user_role where ... /* I'd like to avoid it! */ 
+0

你有什麼問題? – Rembo

+0

非常感謝您的回覆。我將編輯我的問題以發佈問題 – Tiago

+0

@Tiago,因此您嘗試將用戶與數據庫中的其他用戶合併? – user3252538

回答

1

我認爲,問題是你是試圖合併一個detached entity。如果這樣,獨立實體不再在你堅持下去它相同會議。當你合併,你需要創建新實例,並嘗試從以前的管理實例複製狀態(它不再管理實體,因爲它脫離實體),所以你得到一個空的狀態,因爲它是空的休眠刪除此對象。您需要將您的託管實體從會話中取出,然後執行合併。這只是我的猜測。

編輯:

您的實體是級聯的。這些實體的結果表示在您的user_role中。假設您將用戶(ID = 30L)與某些角色集合保持在一起。現在,您在UI中處理了這個分離的對象,並且由於某些情況想要合併()。如果是這樣,你只需使用SAME TYPE和THE SAME創建新的實例(在你的UI中爲它設置一個新的狀態(通常你不創建它,你只需通過id從會話範圍中獲取它)。執行它,休眠嘗試找到對象具有相同的身份。

  1. 如果它發現它,它只是更新它在表格中。

  2. 如果沒有,它會在你的表一個新的。

    所以我認爲你的版本是第一個。

+0

非常感謝您的回覆。我用一個例子更新了這個問題來解釋我的觀點。 – Tiago

+0

謝謝你的幫助。每當我需要合併這個實體時,我都必須從上下文中找到它(查找),更新我想合併和合並實體的字段。我不能簡單地實例化它並設置PK。如果我需要更新關係,我簡單地加載它,刪除我想刪除的條目並添加我想包含的實例。 – Tiago

+0

是的,這是一個正確的方法:) – user3252538

相關問題