更新对象时HibernateOptimisticLockingFailureException

时间:2011-09-26 13:16:57

标签: hibernate

我在更新对象时遇到异常。

  

HibernateOptimisticLockingFailureException:类[User]的对象   带标识符[25614]:乐观锁定失败;嵌套异常   是org.hibernate.StaleObjectStateException:行已更新或删除   通过另一个事务(或未保存的值映射不正确):   [用户#25614]

情况: - 我面临这个错误的原因是我有一个显示用户的表单,我有两个按钮,一个用于更新密码,另一个用于编辑用户的详细信息。当我点击更新密码时,它只是查询对象并更新其密码并将对象保持在休眠会话中。然后我单击编辑按钮并修改信息,然后保存它然后它给出上面提到的异常,因为我试图保存的对象不是休眠会话对象,但是更新时hibernate查询具有相同标识符的对象密码。现在我有两个具有相同标识符的对象,一个在hibernate会话中,另一个没有持久化(不是分离对象)。我想更新保存更改从非持久化对象到数据库,但因为有一个具有相同标识符的对象在hibernate会话中,所以hibernate给出了异常。

如何将非持久对象的更改合并到持久对象?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我遇到了同样的问题,发现我要删除的记录有一个关联的外键,它正在删除另一个表中的所有相关条目,在第二个事务中,我必须更新另一个表上的记录。所以这也可能是我使用 “更新对象时的 HibernateOptimisticLockingFailureException”