2012-07-03 44 views
1

我們將用戶對象保留在會話中。當我們第一次更新它(使用entityManager.merge(ent))時,它工作正常;但第二次我得到以下異常:嘗試在休眠中第二次更新記錄時發生異常

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.kids.domain.Child#22] 
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:492) 
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:256) 
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:86) 
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:781) 
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:766) 

我使用的彈簧,休眠& JPA。 Spring在DAO中注入EntityManager。我明白,如果我會每次都做一個新的find(),然後對該對象進行所有更改,然後merge()..它會正常工作..但在我的情況下,我不能這樣做。

我也檢查過,使用的EntityManager的哈希碼是相同的時間;即同一個EntityManager實例正在使用這兩個時間那麼爲什麼它在嘗試第二次更新記錄時會產生此異常

任何幫助將不勝感激。

回答

0

當您在當前事務中調用merge方法時,hibernate會將給定對象的狀態複製到具有相同標識符的持久對象上,並返回新的可管理實體。您需要處理合並在後續操作中返回的可管理實體,因爲此實體的新版本比數據庫中的版本更新。

+0

我試圖根據這個假設進行調試;合併確實會返回一個新的對象(具有不同的哈希碼),但它與原始對象具有相同的版本。我認爲在調用commit後版本會更新(這是由spring框架完成的) – Deepak

2

我嘗試了很多東西,但沒有任何工作。即使在互聯網上也沒有解決辦法。最後,當我從我的實體中刪除版本(即刪除由休眠提供的OptimisticLockException支持)時,一切都開始正常工作。可能我會嘗試自己處理OLE。