2014-04-06 25 views
2

假設我想合併一個分離的實體。 當我JPA EntityManager的合併方法是否會導致OptimisticLockException?

T mergedEntity = entityManager.merge(detachedEntity); 

EntityManager的將加載的實體(與用detachedEntity相同標識符)從數據庫,然後從detachedEntity的所有數據複製到新裝入的實體。當我的交易結束後,這個實體將被保存到數據庫中。

然而,在並行的情況下,在數據庫中的實體可以被其他事務更新的實體在我的交易,首先加載,然後在我的交易結束沖洗。 在這種情況下,我想知道是否會拋出OptimisticLockException?如果是這樣,爲什麼合併API沒有在Java doc中指定OptimisticLockException? http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#merge(T)

感謝

+0

我認爲合併不會從數據庫中檢索得到的管理實體,但將只克隆給定的脫管的實例。 AFAIK無論如何將會在啓用樂觀鎖定的情況下檢索版本值。我希望@JB Nizet確認他是否不介意。 – Gab

回答

3

因爲merge()方法是不是會拋出此異常。當存儲器中的實體狀態將被刷新到數據庫時,將拋出此異常。這不會發生在merge()被調用,當flush()被調用,無論是明確地,或在提交前,或在執行查詢之前。

+0

感謝您提醒合併不刷新數據庫。應在交易 – danny

3

JPA EntityManager的合併方法會導致OptimisticLockException嗎?

不,不是直接。

我想知道OptimisticLockException是否會拋出 ?如果是這樣,爲什麼合併API沒有在Java doc中指定 OptimisticLockException?

顯然只有在配置樂觀鎖定的情況下才會拋出。此外,由於它繼承自java.lang.RuntimeException,所以merge方法不必聲明它。

但這是所有假設,因爲OptimisticLockException甚至沒有在合併階段拋出,但同時將更改刷新到數據源。

+0

OptimisticLockException繼承RuntimeException的結束髮生可能不是,它不是在方法聲明,因爲EntityManager的尋找和鎖定方法做聲明OptimisticLockException的原因。我認爲原因就像你和其他人所說的,合併不會直接導致問題。謝謝! – danny

相關問題