5

下面是用例:我在 3 列上定义了一个唯一索引,比如 A、B、C。假设其中的值为 A1,B1,C1。我的 java 代码正在添加一条新记录,例如 A1、B1、C1,但在添加此记录之前,我将先前的值从 C1 更新为 C2。在尝试添加新记录时(更新后),hibernate 抛出了一个唯一的约束违规异常。为什么会这样?以上所有语句都在同一个事务中执行。我的假设是插入发生在更新之前,因此是异常的原因。

有什么想法/建议吗?

4

2 回答 2

4

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

于 2010-08-19T17:10:33.827 回答
4

我的 java 代码正在添加一条新记录,例如 A1、B1、C1,但在添加此记录之前,我将先前的值从 C1 更新为 C2。在尝试添加新记录时(更新后),hibernate 抛出了一个唯一的约束违规异常。为什么会这样?以上所有语句都在同一个事务中执行。

这就是 Hibernate 的设计行为方式,它会在save()时间(A1、B1、C1)插入值,然后更新它们(C1 到 C2),它不会插入 A1、B1、C2)。在同花顺中引用插入和更新中的国王:

预期的 Hibernate 行为(我们已经讨论过这是否真的正确!)是 INSERT 语句将准确插入调用 save() 时设置的数据。这为用户提供了更细粒度的控制,尤其是在有触发器等的环境中。但是,如果你不小心,它可能会表现得很糟糕。

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

于 2010-08-20T06:46:10.550 回答