以下是用例: 我有一个唯一的索引定义在3列,如A,B,C。假设它们中的值是A1,B1,C1。 我的java代码是添加一条新记录,例如A1,B1,C1,但在添加此记录之前,我将之前的值从C1更新为C2。在尝试添加新记录(更新后)时,hibernate会抛出一个唯一的约束违例异常。有什么理由为什么呢?以上所有陈述均在同一交易中执行。我的假设是插入在更新之前发生,因此是异常的原因。
有任何想法/建议吗?
答案 0 :(得分: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)。
答案 1 :(得分:3)
尝试在更新后使用session.flush()。