2016-03-30 145 views
1

我提示以下錯誤:在我的Web應用程序:Hibernate的樂觀鎖定異常

Handling an unexpected exception in webApp: - javax.servlet.error.status_code = 500 - javax.servlet.error.exception_type = class org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException - javax.servlet.error.message = Object of class [domain.entity.common.dataEntity] with identifier [110837262]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [domain.entity.common.dataEntity

我不知道爲什麼這個錯誤發生時,它在下面的行中出現。

SpecEntity specTemp = this.persistService.merge(specTemp); 

是否有人可以幫助這裏..

回答

5

在這種情況下,HibernateOptimisticLockingFailureException例外,因爲當你試圖調用mergeentity(specTaskTemp)則表示發生,是由在平均時間已更新另一筆交易。

如果你看SpecEntity類,你必須定義@Version列。這將被hibernate用來檢查你正在合併的實體是否比數據庫中的實體更舊。

採樣流量:

  1. 事務T1載荷具有版本的列值作爲
  2. 事務T2加載相同SpecEntity與版本值1
  3. T2 SpecEntity實體使得一些改變這個實體和更新數據庫,因此版本值變爲2.
  4. 隨後T1嘗試更新實體。
  5. 休眠檢查是否在該實體的版本(即,1)是相同的數據庫中的值(其被更新爲2)。
  6. 而當它發現不匹配時,它會拋出HibernateOptimisticLockingFailureException

根據你的使用情況,您可以重新從數據庫中更新的entity並顯示updated data給用戶,使用戶可以決定下一步做什麼。

或者,如果你想繼續與在specTaskTemp實體數據的數據庫覆蓋數據,你可以得到最新的版本從數據庫這個實體,它的版本值複製到specTaskTemp實體,然後調用merge通話。

+0

感謝或答覆。我想知道的東西如..爲什麼它扔在GenDataEntity誤差GenDataEntity延伸SpecEntity ..會出現這種情況,如果有合併或在SpecEntity同一會話堅持..我們可以跟蹤在數據庫中通過其ID-110837262陳舊的對象.. – Trin

+0

@Teena不知道如果我可以回答,而不看你的域模型和你的應用程序的流程。現在,既然您知道問題的癥結所在,並且可能會發生此異常,則可以啓用show_SQL屬性,並查看導致問題的確切順序的事件。 –