我在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的方法。
我试过
答案 0 :(得分:1)
在Session flush the DML operation order期间:
因此,即使删除元素并添加新元素,插入也会在删除之前运行,因此抛出约束违例异常。
要使其正常工作,您需要在删除之后以及在将新元素添加回子集合之前手动刷新:
a.removeChild(b);
session.flush();
a.addChild(ba);
如果您的域模型中存在这种情况,则remove / addChild是设置双向关联两侧的实用程序。