我有一个多对多的关系,其中链接表有一个额外的属性。因此,链接表也由实体类表示,并称为Composition
。 Composition
的主键是@Embeddable
链接到相关实体,例如。 2 @ManyToOne
个引用。
当选择2个引用中的任何一个时,用户会发生错误,因此必须更新复合主键。但是由于JPA(hibernate)如何工作,这当然总是创建一个新行(插入)而不是更新,旧的Composition
仍然存在。最终结果是添加了一个新行而不是一个正在更新的行。
选项1:
旧的Composition
可以在插入新的OptimisticLockException
之前删除,但这需要处理此问题的相应方法同时需要旧版本和新版本。此外,由于更新后的版本实际上是一个新的实体,因此乐观锁定将无效,因此上次更新将始终获胜。
选项2:
原生查询。该查询还会增加版本列,并在WHERE子句中包含版本。如果更新计数为0(并发修改或删除),则抛出{{1}}
什么是更好的选择?这个问题的“常用方法”是什么?
答案 0 :(得分:2)
为什么不将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;
....