我有一个使用@OneToMany和@ManyToOne注释实现父子关系的树。
每个孩子都有@ManyToOne父字段,每个父母都有@OneToMany。
儿童和父母都是异质的,任何类型的实体都可能属于任何父母类型的父母。
在这种情况下,Hibernate创建并管理与额外的parent_child表的关系,就像它对@ManyToMany关系一样。
一切顺利(我能够创建和删除任何对象),直到我尝试实现更改父对象,并且违反约束。
该操作实施如下:
oldParent.children.remove(child);
child.parent = newParent;
newParent.children.add(child);
正如预期的那样,Hibernate会生成3个更改请求:一个用于更新child.parent值,另外两个用于更新新父项和新父项的子集合。
问题是收集更新的顺序错误:它尝试在删除旧关系之前添加新关系,这会导致违反约束,因为不允许使用两个父项。
如何强制更新正确的顺序?或者如何在这种情况下避免使用附加表?
答案 0 :(得分:2)
首次删除后,您应该调用flush。这将删除初始父关系。现在,如果你重新加载父母和孩子,你应该能够将它们相互关联。
答案 1 :(得分:0)
实际上,除非你需要,否则你不需要在任何阶段调用flush()。我不能说Hibernate而是JPA标准,实现必须按照遵守域所要求的约束顺序排列语句。
请与Batoo JPA一起尝试相同的案例,并告诉我们它是否适合您。否则我们可以帮到你。