4

考慮這個場景: 一個Db事務從包含版本控制的不同表中創建多個行。Hibernate(JPA):當幾個對象被修改和提交時如何處理StaleObjectStateException

例如: 店鋪和產品。 shopList可能包含產品(其數量在shoplist中)並且產品具有其當前庫存。

當我插入ou編輯shopList時,我想更新shopList中這些產品的庫存以保持庫存一致。爲此,我打開一個交易,插入/更新shopList,更新每個產品的庫存(應用增量),然後提交交易。至今沒什麼大不了的。

但是,其他用戶可能已經更新了一個或多個共同的產品。甚至更新shopList本身。在這兩種情況下,在提交事務時我都會得到一個StaleObjectStateException。

問題是:有沒有辦法確定哪個表導致StaleObjectStateException?

如果產品引起異常,我可以刷新數據庫中的所有環境產品,然後重新應用庫存量增量。這很好。 如果shopList導致異常,最好將問題簡單報告給用戶,以便他可以重新開始。

非常感謝您的幫助。

回答

4

我發現如何。

第一件事情第一件事: JPA(或hibernate本身)將org.hibernate.StaleObjectStateException異常包裝爲javax.persistence.OptimisticLockException。 因此,如果您想要捕獲正確的異常,請參閱OptimisticLockException。

第二: 當您在提交之前調用EntityManager的方法Flush時,hibernate只會拋出OptimisticLockException。如果直接調用Commit,則會得到另一個異常(我忘記了)。考慮到幾乎每個人都會捕獲由commit方法發出的異常並進行事務回滾,您將得到一個Rollback的相關異常(不能再記住它)。

第三個和最後回答我的原始問題: 您只需從OptimisticLockException實例調用getEntity方法即可獲取版本控制錯誤的來源。這將爲您提供任何您需要的相關信息。

謝謝所有通過這裏的人。 如有任何問題,只需詢問,我會很樂意提供幫助。

+1

只有在調用session.flush時才引發異常的滿分。如果它未被調用,它將作爲RollbackException返回。在這個例外上,你無法做任何事情。你不能查詢任何信息,因爲它沒有任何信息。確保您呼叫同花順。 – sethu 2013-03-05 05:40:29

相關問題