我可以只檢查orphanRemoval = true的工作原理嗎?它是SQL操作,即在合併更改後檢查數據庫中的孤兒。或者它是一個在內存操作中跟蹤對象已從集合中刪除,因此它必須被刪除?orphanRemoval = true如何在JPA 2.0中工作
什麼是力學?
例如,如果兩個人正在編輯相同的數據,並且兩個人都有一個實體x.collectionY並且collectionY中有一個ID爲1,2,3,4的項目......那麼當兩個用戶都在應用程序他們有相同的起點。如果用戶1添加項目5,6,7,然後用戶2提交...因爲5,6,7不是他們收藏的一部分會發生什麼?
另外,如果您將一個集合替換爲另一個支持bean中的另一個集合,那麼這會如何影響跟蹤。
對不起,對於基本的問題,但如果是SQL操作,我會好的並且理解它,但是現在我們正在使用它,所以需要讓我的頭部圍繞它。
您好,感謝。我想我的擔心是如果它在記憶操作。用戶a擁有一個包含集合中項目1,2,3的對象。用戶2打開sames實例並將4,5,6添加到同一個集合中。這兩個用戶現在在實體的內存視圖中都有不同 - 一個集合包含1,2,3,一個包含1,2,3,4,5,6。如果用戶2提交,然後用戶1提交,因爲它在內存中 - JPA認爲是因爲項目4,5,6在數據庫中,似乎鏈接到實體 - 但不在用戶中1在Memory Collection(1 ,2,3)然後4,5,6被刪除。這與鎖定不同。 – smackenzie
直到他們提交後纔會發生任何事情,而且一次提交總是首先執行。您不能在多個線程上共享一個EntityManager,因此每個用戶都有一個不同的託管實例進行更改 - 它們應該是或應該是單獨的事務和數據視圖,因此可以相互獨立地進行更改。他們需要鎖定以防止用陳舊的數據覆蓋更改,完全獨立於孤兒刪除。孤兒刪除發生的情況與更改任何字段時發生的情況完全相同,如果您在沒有鎖定的情況下合併陳舊的實體 - 最後一個將獲勝。 – Chris
因此在這個例子中,用戶2的晚期提交導致用戶2的項目4,5,6被刪除,因爲它們在提交時不是用戶1的一部分 - 通過orphanRemoval? – smackenzie