我有2个实体(父级和子级),它们之间具有OneToMany关系。

父级具有子级列表,子级具有父级字段。

孩子有

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


在父字段中。

父母有

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


在子列表中。

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

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

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



编辑

我宁愿避免使用EntityManager.flush()

最佳答案

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


加载ParentA
将ChildA父级设置为NULL
救救孩子
关闭或刷新会话
公开会议
将ParentB设置为ChildA
合并ChildA(使用合并不保存/更新/保存或更新)


我认为第4步和第5步可能不是必需的,但我不确定,您必须将其放入纸盘。

您可以将以下4到5步替换为:session.evict(ParentA)

10-08 17:36