gpt4 book ai didi

java - 如何正确锁定和重新加载实体

转载 作者:可可西里 更新时间:2023-11-01 06:50:30 24 4
gpt4 key购买 nike

在我的 Web 应用程序中,我有多个线程可能同时访问相同的数据,这就是为什么我决定使用 Hibernate 实现乐观(版本控制)和悲观锁定。

目前我使用以下模式来锁定一个实体并对其执行写操作(使用 Springs 事务管理器和带有@Transactional 的事务划分):

@Transactional
public void doSomething(entity) {
session.lock(entity, LockMode.UPGRADE);
session.refresh(entity);

// I change the entity itself as well as entites in a relationship.
entity.setBar(...);
for(Child childEntity : entity.getChildren()) {
childEntity.setFoo(...);
}
}

但是,当 @Transactional 刷新时,有时我会收到 StaleObjectException,这告诉我 ChildEntity 已被同时修改,现在版本错误。

我想我没有正确刷新entity 及其子节点,所以我正在处理陈旧的数据。有人可以指出如何实现这一目标吗?我的一些想法包括清除持久性上下文( session )或再次调用 session.lock(entity, LockMode.READ),但我不确定这里什么是正确的。

感谢您的帮助!

最佳答案

您可能想看看这个 Hibernate 问题:LockMode.Upgrade doesn't refresh entity values .

简而言之:如果给定的实体已经预加载,Hibernat 不会在成功锁定后执行选择。您需要在收到锁后自行为实体调用刷新。

关于java - 如何正确锁定和重新加载实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6691922/

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