我有一个多对多关系,其中链接表有一个附加属性。因此,链接表也由实体类表示,称为Composition
。主键为Composition
is an @Embeddable
链接到相应的实体,例如。 2@ManyToOne
参考。
用户在选择两个引用中的任何一个时可能会出错,因此必须更新复合主键。然而,由于 JPA(休眠)的工作方式,这当然总是会创建一个新行(插入)而不是更新和旧行Composition
仍然会存在。最终结果是添加了新行而不是更新了行。
选项1:
The old Composition
可以在插入新版本之前删除,但这需要处理此问题的相应方法需要旧版本和新版本。另外,由于更新的版本实际上是一个新的实体,乐观锁定将不起作用,因此最后的更新将始终获胜。
选项2:
本机查询。该查询还会递增版本列并在 WHERE 子句中包含版本。扔OptimisticLockException
如果更新计数为0(并发修改或删除)
什么是更好的选择?解决这个问题的“共同方法”是什么?
为什么不直接更改主键Composition
是自动生成的UID吗?然后,用户可以更改对正在加入的实体的两个引用,而无需删除/重新创建Composition
实体。然后乐观锁定将被维持。
编辑:例如:
@Entity
@Table(name = "COMPOSITION")
public class Composition {
@Id
@Column(name = "ID")
private Long id; // Auto-generate using preferred method
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn( .... as appropriate .... )
private FirstEntity firstEntity;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn( .... as appropriate .... )
private SecondEntity secondEntity;
....
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)