Hibernate StatelessSession.upsert() 基于@NaturalId

问题描述 投票:0回答:1

我有这样的实体,具有基于 3 个 varchar 列的代理 PK 和唯一键。

public class InvoiceEntity {

    @Id
    @GeneratedValue
    private UUID id;

    @NaturalId
    private InvoiceUniqueKey invoiceId;
}

使用

statelessSession.upsert(invoiceEntity)
它确实生成以下sql

merge into invoice as t using (select cast(? as uuid) id ... as s on (t.id=s.id)

所以问题是 - 我如何强制休眠在合并子句中使用我的唯一键(

@NaturalId
)而不是主键
@Id

我尝试了 hibernate 中的所有注释,阅读了文档,但没有发现任何可以让我能够以这种方式使用它的东西。

hibernate jpa orm upsert stateless-session
1个回答
0
投票

使用 upsert 时,默认使用主键

@Id
来确定行是否存在。 当您分配了
@NaturalId
时,Hibernate 告诉数据库强制执行唯一性。当您更新插入并且标记为
MySQLIntegrityConstraintViolationException
的字段以正确的顺序存在时(根据您的 varchar 列),您将收到摘录错误 (
@NaturalId
)

如果您想避免出现摘录错误,则必须在插入或更新之前检查重复键(

@NaturalId
)。

© www.soinside.com 2019 - 2024. All rights reserved.