Hibernate在更新唯一键的字段部分时抛出唯一约束违例异常

问题描述 投票:4回答:2

以下是用例:我在3列上定义了唯一索引,例如A,B,C。假设它们中的值是A1,B1,C1。我的java代码是添加一条新记录,例如A1,B1,C1,但在添加此记录之前,我将之前的值从C1更新为C2。在尝试添加新记录(更新后)时,hibernate会抛出一个唯一的约束违例异常。有什么理由为什么呢?以上所有陈述均在同一交易中执行。我的假设是插入在更新之前发生,因此是异常的原因。

有什么想法/建议?

java hibernate unique-constraint unique-index
2个回答
3
投票

尝试在更新后使用session.flush()。


4
投票

我的java代码是添加一条新记录,例如A1,B1,C1,但在添加此记录之前,我将之前的值从C1更新为C2。在尝试添加新记录(更新后)时,hibernate会抛出一个唯一的约束违例异常。有什么理由为什么呢?以上所有陈述均在同一交易中执行。

这就是Hibernate的设计行为,它将在save()时间(A1,B1,C1)插入值,然后更新它们(C1到C2),它不会插入A1,B1,C2)。在Insert and Update in same flush引用国王:

预期的Hibernate行为(我们一直在争论这是否真的正确!)是INSERT语句将完全插入调用save()时设置的数据。这为用户提供了更细粒度的控制,特别是在有触发器等的环境中。但是,如果你不小心,它可能会表现不佳。

建议:直接延迟保存插入(A1,B1,C2)。

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