0

我有一个使用 @OneToMany 和 @ManyToOne 注释实现的父子关系树。

每个孩子都有@ManyToOne 父字段,每个父母都有@OneToMany。

孩子和父母都是异构的,任何类型的实体都可能属于任何父母类型的父母。

在这种情况下,Hibernate 使用附加的 parent_child 表创建和管理关系,就像它为 @ManyToMany 关系所做的那样。

一切都很顺利(我能够创建和删除任何对象),直到我尝试实现更改对象父对象并违反约束。

操作执行如下:

oldParent.children.remove(child);
child.parent = newParent;
newParent.children.add(child);

正如预期的那样,Hibernate 生成了 3 个更改请求:一个更新 child.parent 值,两个更新新旧父母的子集合。

问题在于集合更新的错误顺序:它尝试在删除旧关系之前添加新关系,这会导致违反约束,因为不允许有两个父关系。

如何强制更新的正确顺序?或者在这种情况下如何避免使用附加表?

4

2 回答 2

2

第一次删除后,您应该调用flush。这将删除初始父关系。现在,如果您重新加载父母和孩子,您应该能够将它们相互关联。

于 2012-10-05T15:26:32.707 回答
0

实际上,除非您需要,否则您不需要在任何阶段调用 flush()。我不能代表 Hibernate 而是 JPA 标准,实现必须以尊重和发挥域所需约束的顺序对语句进行排序。

请使用Batoo JPA尝试相同的案例,并让我们知道它是否适合您。否则我们可以帮助您。

于 2012-10-05T18:37:43.980 回答