java - 在休眠中替换父级的最佳方法
问题描述
我有 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()
解决方案
试试这种方式(ChildA 有 ParentA 作为父母):
- 加载父 A
- 将 ChildA 父级设置为 NULL
- 拯救孩子A
- 关闭或刷新会话
- 公开课
- 将 ParentB 设置为 ChildA
- 合并 ChildA(使用合并而不是保存/更新/保存或更新)
我认为第 4 步和第 5 步可能没有必要,但我不确定,你必须把它放在托盘上。
也许您可以替换为 4 和 5 个步骤: session.evict(ParentA)
推荐阅读
- react-native - 我不能在弹出的裸博览会项目中使用任何使用链接的库
- python - 如何在python django中三次输入错误密码时锁定用户
- python - 如何在networkx图上定义属性以将其导出为gephi即形状
- c - 如何运行 2 个子进程,但在 C 中一个接一个地运行?
- php - Docker:禁止您无权访问此资源
- python-3.x - Keras 模型 AttributeError:“str”对象没有属性“call”
- swift - 当设备方向更改 SWIFT 5 时重绘自定义 UIVIEW
- jquery - jQuery选择具有相同ID的当前元素
- c++ - 性能建议编译器 - 这样的事情存在吗?
- python - 创建嵌套字典的更好方法?