更新对象时HibernateOptimisticLockingFailureException

Muk*_*mar 4 hibernate

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

HibernateOptimisticLockingFailureException:具有标识符[25614]的类[User]的对象:乐观锁定失败; 嵌套异常是org.hibernate.StaleObjectStateException:Row被另一个事务更新或删除(或unsaved-value映射不正确):[User#25614]

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

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

JB *_*zet 7

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