4

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

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

选项1:

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

选项 2:

本机查询。该查询还会增加版本列并在 WHERE 子句中包含版本。OptimisticLockException如果更新计数为 0(并发修改或删除)则抛出

什么是更好的选择?这个问题的“共同方法”是什么?

4

1 回答 1

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;

....
于 2013-09-17T22:30:07.877 回答