1

在使用休眠 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

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

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

我正在尝试使用休眠合并来执行此操作,但它抛出了异常:

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

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

4

1 回答 1

0

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

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

于 2021-04-19T11:46:23.320 回答