删除的对象将通过级联重新保存从关联中删除删除的对象:尝试将一个子项从一个父级附加到另一个时出错

问题描述

在使用 hibernate 5.0.9 的应用程序中有嵌套的父子关系,其中父是关系所有者,如下所示。

表格:-

ParentEntity
@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id")
@OrderBy("listOrder ASC,dateCreated ASC")
private Set<ChildEntity> childCollection;

ChildEntity
@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "child_id")
@OrderBy("col_id ASC,list_order ASC")
private Set<GrandChildEntity> grandChildCollection;

GrandChildEntity

我想按如下方式更新父母的孩子和孙子:-

从数据库读取现有的父级并获取所有子级及其孙子级的集合。 将现有的grandChild 从一个孩子移动到另一个孩子,因此要求只是必须更新grandChild 的child 引用,而grandChild 的DB 中的所有列都必须保持不变。

我正在尝试使用 hibernate merge by 来执行此操作,但它向我抛出异常:

已删除的对象将通过级联重新保存(从关联中删除已删除的对象)

如何在单个事务中从现有子集合中删除孙子集合并附加到其他子集合??

解决方法

我认为这与您在应用中使用的映射不完全相同?您是否也在使用 orphanRemoval?我不认为跨多个关联的孤立删除有效,因此将实体从一个对多关联移动到另一个关联仍会将实体标记为孤立。移除孤立移除配置,并在您确定确实应该移除实体时手动移除实体。

除此之外,我还建议您将关联设为双向并在多方使用 mappedBy。以便 FK 列侧驱动关联,这使您能够通过更改对象的父项来“移动”对象。在使用 @OrderBy 的关联上使用 Set 也是没有意义的。只需删除该注释。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...