在hibernate中替换parent的最佳方法

时间:2018-04-26 07:45:28

标签: java hibernate

我有两个实体(父和子),它们之间有一个OneToMany关系。

父母有儿童名单,儿童有父母字段。

孩子有

 @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})

在父字段中。

家长

@OneToMany(mappedBy="parent", cascade = CascadeType.ALL, orphanRemoval = true)

在子列表中。

我想找到一种方法将一个孩子的父母替换为另一个孩子。 (即将ChildA的Parent从ParentA更改为ParentB)

因为我想要遵循父列表,我想从列表中删除子项。 问题是即使我首先将ChildA添加到ParentB的列表中,也将ChildA的Parent字段设置为ParentB,然后将其从ParentA的Child列表中删除,因为它以某种方式完全删除了Child(显然是因为OrphanRemoval)

如何在不更改hibernate配置的情况下进行此交换  和删除ParentA的列表(OrphanRemoval等)?

修改

我更愿意避免使用entityManager.flush()

1 个答案:

答案 0 :(得分:1)

尝试这种方式(ChildA将ParentA作为父级):

  1. 加载ParentA
  2. 将ChildA父级设置为NULL
  3. Save ChildA
  4. 关闭或刷新会话
  5. 开放会话
  6. 将ParentB设置为ChildA
  7. 合并ChildA(使用merge not save / update / saveOrUpdate)
  8. 我认为步骤4和5可能没有必要,但我不确定,你必须托盘。

    你可以用以下代码替换4和5个步骤:session.evict(ParentA)