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