gpt4 book ai didi

java - 合并父实体时,OneToMany 中所有子实体的版本都会增加

转载 作者:太空宇宙 更新时间:2023-11-04 08:33:36 26 4
gpt4 key购买 nike

我有一个 OneToMany 关系定义如下:

@Entity
Parent extends BaseEntity {
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE})
private List<Child> childList;
// ...
}

@Entity
Child extends BaseEntity {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PARENT_ID")
private Parent parent;
// ...
}

@Version 注释在 BaseEntity 类中定义。这些实体将转换为 DTO 并由客户端进行更改。现在,当客户端更改其中一个子元素时,父元素及其子元素将转换回实体,并通过执行 em.merge(parent) 完成合并,所有子元素的版本都会增加 1!我预计更改后的子项的版本只会增加。首先,我认为这是因为我的 EntityCallbackListener 拦截了与 @PreUpdate 的合并。但是,如果我注释掉回调方法,其他子项的版本字段仍然会增加。有人对这种行为有解释吗?

我正在使用 OpenJPA 1.2.3。

<小时/>

好吧,RTFM 有时会有所帮助...:-/

增加所有子项的版本是 OpenJPA 默认设置:

This lock manager does not perform any exclusive locking, but instead ensures read consistency by verifying that the version of all read-locked instances is unchanged at the end of the transaction. Furthermore, a write lock will force an increment to the version at the end of the transaction, even if the object is not otherwise modified. This ensures read consistency with non-blocking behavior.

This is the default openjpa.LockManager setting in JPA.

可以使用悲观锁管理器及其属性来覆盖此设置:

The pessimistic LockManager can be configued to additionally perform the version checking and incrementing behavior of the version lock manager described below by setting its VersionCheckOnReadLock and VersionUpdateOnWriteLock properties.

所以我将 OpenJPA 配置为在更新时不更改版本:

<property name="openjpa.LockManager" value="pessimistic(VersionCheckOnReadLock=true,VersionUpdateOnWriteLock=false)"/>

但是它不起作用。所有子项的版本字段仍然递增。我错过了什么吗?为了让 OpenJPA 仅更新已更改实体的版本字段,我必须配置什么?

最佳答案

问题是 equals() 和 hashcode() 实现不正确,因此 EntityManager 假定列表中的所有实体都已更改。

关于java - 合并父实体时,OneToMany 中所有子实体的版本都会增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6923105/

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