gpt4 book ai didi

JPA @EmbeddedId : How to update part of a composite primary key?

转载 作者:行者123 更新时间:2023-12-03 19:59:58 30 4
gpt4 key购买 nike

我有一个多对多关系,其中链接表有一个附加属性。因此,链接表也由实体类表示,称为 Composition . Composition的主键是 @Embeddable链接到相应的实体,例如。 2 @ManyToOne引用。

用户可能会在选择 2 个引用中的任何一个时出错,因此必须更新复合主键。但是,由于 JPA(休眠)的工作方式,这当然总是会创建一个新行(插入)而不是更新和旧的 Composition仍然会存在。最终结果是添加了新行而不是更新行。

选项1:

Composition可以在插入新版本之前删除,但这需要相应的方法处理这需要旧版本和新版本。再加上由于更新的版本实际上是一个新的实体,乐观锁定将不起作用,因此最后一次更新将始终获胜。

选项 2:

native 查询。该查询还会增加 version 列并在 WHERE 子句中包含 version。扔 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;

....

关于JPA @EmbeddedId : How to update part of a composite primary key?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18205248/

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