【问题标题】:Best way to replace parent in hibernate在休眠中替换父级的最佳方法
【发布时间】:2018-04-26 07:45:28
【问题描述】:

我有 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()

【问题讨论】:

标签: java hibernate


【解决方案1】:

试试这个方法(ChildA 有 ParentA 作为父母):

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

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

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

【讨论】:

  • 是的,我考虑过冲洗,但在我的情况下它有点冒险,所以我宁愿避免它......但它确实可以工作:)
猜你喜欢
  • 2023-04-06
  • 2011-06-03
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
相关资源
最近更新 更多