我有这样的实体,具有基于 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 中的所有注释,阅读了文档,但没有发现任何可以让我能够以这种方式使用它的东西。
使用 upsert 时,默认使用主键
@Id
来确定行是否存在。
当您分配了 @NaturalId
时,Hibernate 告诉数据库强制执行唯一性。当您更新插入并且标记为 MySQLIntegrityConstraintViolationException
的字段以正确的顺序存在时(根据您的 varchar 列),您将收到摘录错误 (@NaturalId
)
如果您想避免出现摘录错误,则必须在插入或更新之前检查重复键(
@NaturalId
)。