【问题标题】:hibernate parent-child children update wrong update orderhibernate父子子更新错误更新顺序
【发布时间】:2014-08-24 09:25:14
【问题描述】:

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

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

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

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

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

操作实现如下:

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

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

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

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

【问题讨论】:

    标签: hibernate collections


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢你,哈桑!同意,实现必须订购更改事件,但这个没有:-(也感谢 Batoo 的链接。我有时间会尽快尝试。
      • 顺便说一句,Batoo 是否能够根据实体管理器信息创建/更新数据库架构?
      • 是的,它是...您可以将 org.batoo.jpa.ddl 属性与 DROP、CREATE、UPDATE、NONE 选项一起使用...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2020-09-11
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多