2011-09-26 94 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); 
相关问题