JPA @EmbeddedId:如何更新复合主键的一部分?

时间:2013-08-13 09:22:56

标签: jpa embedding composite-primary-key optimistic-locking

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

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

选项1:

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

选项2:

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

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

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;

....
相关问题