问题描述
在以下情况下:两个Spring Bean ServiceA和ServiceB,ServiceA加载一个实体,然后调用Bean ServiceB的方法,该方法加载并保存相同的实体。
ServiceB方法完成后,将提交事务,并将实体版本从1移到2。 在该调用之后,如果我尝试再次加载ServiceA版本中的相同实体,则该实体仍为1。 当然,这会导致在ServiceA中进行保存调用时出现以下异常:
乐观锁定失败;嵌套的异常是org.hibernate.StaleObjectStateException:行已由另一个事务更新或删除(或未保存的值映射不正确)
@Service
public class ServiceA {
@Autowired
private ServiceB serviceB;
@Autowired
private MyEntityRepository repo;
@Transactional
public void myMethod(Long id) {
MyEntity e = repo.findById(id); -> version 1
serviceB.doStuff(id);
e = repo.findById(id); -> still version 1
...
saveAndFlush(e); -> optimistic lock error
}
}
@Service
public class ServiceB {
@Autowired
private MyEntityRepository repo;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doStuff(Long id) {
MyEntity e = repo.findById(id) -> version 1
...
repo.saveAndFlush(e); -> version 2
}
}
使它工作的唯一方法是在doStuff()调用之后在ServiceA中分离实体,但是它看起来是一个肮脏的解决方案。有更好的解决方案吗?
使用的版本是:
- 休眠:5.4.6.FINAL
- JPA春季数据:2.2.0.RELEASE
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)