如果我 add/remove/update 可靠集合的元素,休眠会增加版本吗?
Will hibernate increment version if I add/remove/update element of dependable collection?
我正在学习hibernate optimistic lock机制,我还没有在user guide
中找到我的问题的答案
假设我们有这样的实体:
@Entity
class Employee{
@Version
Long versionField;
List<Employee> subordinates;
...
}
在某处我们有以下代码:
Employee sub = ....
Emplyee emp = readEmploye();
emp.getSubordinates().add(sub);
在这种情况下我可以控制版本增量吗?
默认没有。因为您不是在更改实体,而是更改链接到它的其他实体。
然而,拥有该功能是可能的,但它需要相当多的配置,最好提前计划。
我不会复制尊敬的 Vlad Mihalcea see here.
的所有代码
基本上你需要使用事件侦听器来拦截保存调用,并使用 RootAware
接口(不是 Hibernate 接口,只是一个助手)被保存的子实体知道它的 "root" 和可以在其父实体上使用 OPTIMISTIC_FORCE_INCREMENT
锁来增加其版本。
关于数据一致性:如果子实体被修改或父实体被修改(或两者都被修改),刷新可能会失败,但是根实体上的 lock()
确保操作是原子的。如果对根的(悲观)锁定成功,并且对子级的(乐观)锁定成功,则整个事务成功。多亏了悲观锁,没有机会获得 "half updates" 会破坏数据。
我正在学习hibernate optimistic lock机制,我还没有在user guide
中找到我的问题的答案假设我们有这样的实体:
@Entity
class Employee{
@Version
Long versionField;
List<Employee> subordinates;
...
}
在某处我们有以下代码:
Employee sub = ....
Emplyee emp = readEmploye();
emp.getSubordinates().add(sub);
在这种情况下我可以控制版本增量吗?
默认没有。因为您不是在更改实体,而是更改链接到它的其他实体。
然而,拥有该功能是可能的,但它需要相当多的配置,最好提前计划。 我不会复制尊敬的 Vlad Mihalcea see here.
的所有代码基本上你需要使用事件侦听器来拦截保存调用,并使用 RootAware
接口(不是 Hibernate 接口,只是一个助手)被保存的子实体知道它的 "root" 和可以在其父实体上使用 OPTIMISTIC_FORCE_INCREMENT
锁来增加其版本。
关于数据一致性:如果子实体被修改或父实体被修改(或两者都被修改),刷新可能会失败,但是根实体上的 lock()
确保操作是原子的。如果对根的(悲观)锁定成功,并且对子级的(乐观)锁定成功,则整个事务成功。多亏了悲观锁,没有机会获得 "half updates" 会破坏数据。