问题描述
在使用 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
也是没有意义的。只需删除该注释。