首页 > 解决方案 > 在休眠中替换父级的最佳方法

问题描述

我有 2 个实体(父母和孩子),它们之间存在 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)

如何在不更改休眠配置并从 ParentA 的列表中删除(OrphanRemoval 等)的情况下进行此交换?


编辑

我更喜欢避免使用 entityManager.flush()

标签: javahibernate

解决方案


试试这种方式(ChildA 有 ParentA 作为父母):

  1. 加载父 A
  2. 将 ChildA 父级设置为 NULL
  3. 拯救孩子A
  4. 关闭或刷新会话
  5. 公开课
  6. 将 ParentB 设置为 ChildA
  7. 合并 ChildA(使用合并而不是保存/更新/保存或更新)

我认为第 4 步和第 5 步可能没有必要,但我不确定,你必须把它放在托盘上。

也许您可以替换为 4 和 5 个步骤: session.evict(ParentA)


推荐阅读