我正在学习休眠乐观锁机制,但我还没有找到我的问题的答案用户指南 https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html#locking-optimistic
假设我们有这样的实体:
@Entity
class Employee{
@Version
Long versionField;
List<Employee> subordinates;
...
}
在某处我们有以下代码:
Employee sub = ....
Emplyee emp = readEmploye();
emp.getSubordinates().add(sub);
在这种情况下我可以控制版本增量吗?
默认情况下没有。因为您没有更改实体,而是更改了链接到该实体的其他实体。
然而,有可能拥有该功能,但需要大量配置,并且最好提前规划。
我不会复制尊敬的 Vlad Mihalcea 的所有代码,see here https://vladmihalcea.com/how-to-increment-the-parent-entity-version-whenever-a-child-entity-gets-modified-with-jpa-and-hibernate/.
基本上,您需要使用事件侦听器来拦截保存调用,并使用RootAware
接口(不是 Hibernate 接口,只是一个帮助器),被保存的子实体知道它的“根”并且可以使用OPTIMISTIC_FORCE_INCREMENT
锁定其父实体以增加其版本。
关于数据一致性:如果子级被修改或父级被修改(或两者都被修改),刷新可能会失败,但是lock()
在根实体上确保操作是原子的。如果根上的(悲观)锁成功,并且子上的(乐观)锁成功,则整个事务会成功。由于悲观锁,没有机会获得会损坏数据的“半更新”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)