似乎无法摆脱NonUniqueObjectException

时间:2014-10-08 20:10:06

标签: java database hibernate jpa orm

我在Java Hibernate中使用SINGLE_TABLE继承策略,这里是设置:

Class A

 @Cascade(CascadeType.DELETE_ORPHAN, CascadeType.ALL)
 List<B> Bs; 

B有一个扩展为B的sublcass Ba.B有一个B没有的额外字段。我这样做的原因是只有Ba对象(它们要少得多)应该关心这个额外的字段,我想避免在每个B对象上使用它的开销。

在保存期间,我们的设置方式是,我们必须更新以前的B对象字段(而不仅仅是更改引用)。所以我们不能做Bs列表=更改B列表,我们必须通过主键找到每个B并更新字段,所以像B.fields = changedB.fields

发生此异常的时间是在保存期间,前一个B对象需要与额外字段一起保存为Ba。反向(将前Ba对象保存到B)很好我可以将额外的字段设置为null或者向下。但我似乎无法找到将B物体变成Ba的方法。

我试过

  • 从列表中删除B并在保存之前添加Ba,即我收到此异常。
  • 我甚至尝试过将所有字段从B交换到需要变成B和副verca的Ba,但是这也没有用,我得到了一个例外因为我改变了这些对象的Pk 。

1 个答案:

答案 0 :(得分:1)

Session flush the DML operation order期间:

  • 插入
  • 更新
  • 集合元素的删除
  • 收集元素的插入
  • 删除

因此,即使删除元素并添加新元素,插入也会在删除之前运行,因此抛出约束违例异常。

要使其正常工作,您需要在删除之后以及在将新元素添加回子集合之前手动刷新:

a.removeChild(b);
session.flush();
a.addChild(ba);

如果您的域模型中存在这种情况,则remove / addChild是设置双向关联两侧的实用程序。