HibernateOptimisticLockingFailureException更新对象时发生异常

HibernateOptimisticLockingFailureException更新对象时发生异常,hibernate,Hibernate,更新对象时出现以下异常 HibernateOptimisticLockingFailureException:类[User]的对象 标识符为[25614]:乐观锁定失败;嵌套异常 is org.hibernate.StaleObjectStateException:行已更新或删除 另一个事务(或未保存的值映射不正确): [用户#25614] 情境:-我面临此错误的原因是我有一个显示用户的表单,其中有两个按钮,一个用于更新密码,另一个用于编辑用户详细信息。当我点击更新密码时,它只是查询对象并更新其

更新对象时出现以下异常

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

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


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

问题的答案是:在第一次事务中更改密码时,用户实体的版本字段会更新,但是在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);

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