2011-09-26 95 views
3

更新對象時出現以下異常。更新對象時出現HibernateOptimisticLockingFailureException

HibernateOptimisticLockingFailureException:類的對象[用戶] 標識符爲[25614]:樂觀鎖失敗;嵌套異常 是org.hibernate.StaleObjectStateException:行被更新或者由另一個事務刪除 (或未保存值的映射是不正確的): [用戶#25614]

情況: - 之所以我面臨此錯誤是我有一個窗體顯示用戶,我有兩個按鈕,其中一個用於更新密碼,另一個用於編輯用戶的詳細信息。當我點擊更新密碼時,它只是查詢對象並更新其密碼並將對象保留在休眠會話中。然後我點擊編輯按鈕並修改信息然後保存它然後它給出上面提到的異常,因爲我試圖保存的對象不是休眠會話對象,但是具有相同標識符的對象被更新密碼。現在我有兩個具有相同標識符的對象,一個在休眠會話中,另一個不持久化(不分離對象)。我想更新保存從未保留的對象到數據庫中的更改,但因爲在hibernate會話中存在具有相同標識符的對象,所以hibernate會發出異常。

如何將未保留對象的更改合併到保留的對象?

回答

6

問題的答案是:在第一個事務中更改密碼時,用戶實體的版本字段會更新,但您在HTTP會話中保留用戶對象的廢棄版本,並嘗試更新用戶在第二個交易中使用這個過時的版本。

只要確保刷新每次更改密碼時保留在HTTP會話中的用戶對象。

您也可以手動將修改後的用戶的每個屬性複製到附加的用戶對象,但您不再受益於樂觀鎖定。

// first transaction: 
User refreshedUser = userService.updateUserPassword(userId, newPassword); 
request.getSession().setAttribute("user", refreshedUser); 

// ... 
// second transaction: 
User modifiedUser = (User) request.getSession().getAttribute("user"); 
modifiedUser = userService.updateUser(modifiedUser); 
request.getSession().setAttribute("user", modifiedUser); 
相關問題