【问题标题】:Hibernate throws unique constraint violation exception while updating field part of unique keyHibernate 在更新唯一键的字段部分时抛出唯一约束冲突异常
【发布时间】:2011-04-01 06:05:15
【问题描述】:

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

有什么想法/建议吗?

【问题讨论】:

    标签: java hibernate unique-constraint unique-index


    【解决方案1】:

    我的 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)。

    【讨论】:

    • 有误传。查询顺序是: begin update table set c = c2 where a=a1,b=b1,c=c1 insert into table(a1,b1,c1) commit 在某个地方 hibernate 在更新之前运行插入是我的假设。我认为更新查询后的 session.flush 会解决
    • @Cshah Ahhhhhh,您不是在更新“新”记录,而是在更新“现有”记录,现在知道了。在这种情况下,确实使用flush() 来“强制”更新发生。
    【解决方案2】:

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

    【讨论】:

    • 如果我在事务中刷新,问题可以支持吗?
    • 我从来没有遇到过这个问题。我不特别记得它是如何工作的或它做了什么,但你可以找到关于 Java Persistence with Hibernate 的解释(这是我第一次尝试这样做时发现的地方)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多