2013-05-21 33 views
1

我可以只檢查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操作,我會好的並且理解它,但是現在我們正在使用它,所以需要讓我的頭部圍繞它。

回答

1

如果您通過將實體引用歸零或使其引用某個不同的參數,JPA孤立刪除操作要求提供者刪除取消引用的實體。這是提供商特定的,所以我不確定你需要知道什麼 - 規範要求刪除的任何東西都是孤立的。您對多個用戶編輯相同數據的問題並不適用於孤兒刪除 - 它們是同步數據訪問的一般問題。這些更改應該與對方發生衝突,而不管是否涉及孤兒刪除,所以您應該使用某種形式的鎖定,樂觀鎖定是最常見的。

如果沒有鎖定,他們很有可能用陳舊的數據覆蓋數據並導致實體被刪除,例如,如果用戶2分離了它的實例,然後嘗試將其現在的陳舊對象合併到實體管理器中。最後,一個事務會覆蓋另一個事務,而沒有某種形式的鎖定。

有許多博客和文檔,你可以找到描述鎖定的,我用最簡單的是http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping/Locking/Optimistic_Locking

+0

您好,感謝。我想我的擔心是如果它在記憶操作。用戶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

+0

直到他們提交後纔會發生任何事情,而且一次提交總是首先執行。您不能在多個線程上共享一個EntityManager,因此每個用戶都有一個不同的託管實例進行更改 - 它們應該是或應該是單獨的事務和數據視圖,因此可以相互獨立地進行更改。他們需要鎖定以防止用陳舊的數據覆蓋更改,完全獨立於孤兒刪除。孤兒刪除發生的情況與更改任何字段時發生的情況完全相同,如果您在沒有鎖定的情況下合併陳舊的實體 - 最後一個將獲勝。 – Chris

+0

因此在這個例子中,用戶2的晚期提交導致用戶2的項目4,5,6被刪除,因爲它們在提交時不是用戶1的一部分 - 通過orphanRemoval? – smackenzie

相關問題