gpt4 book ai didi

更新对象时发生 HibernateOptimisticLockingFailureException

转载 作者:行者123 更新时间:2023-12-03 12:12:38 25 4
gpt4 key购买 nike

更新对象时出现以下异常。

HibernateOptimisticLockingFailureException: Object of class [User] with identifier [25614]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [User#25614]



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

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

最佳答案

答案就在问题中:在第一次交易中更改密码时,更新了用户实体的版本字段,但您在 HTTP session 中保留了用户对象的过时版本,并尝试使用此过时版本更新用户在第二笔交易中。

只要确保每次更改密码时刷新您在 HTTP session 中保留的用户对象。

您还可以手动将修改后的用户的每个属性复制到附加的用户对象,但这样您就无法再从乐观锁定中受益。

// 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7555650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com