如果我 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" 会破坏数据。