休眠 - 具有级联=“all-delete-orphan”的集合不再被拥有实体实例引用

2022-08-31 05:03:12

我在尝试更新实体时遇到以下问题:

"A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance".

我有一个父实体,它有一些子实体。当我尝试更新它时,我会获取要设置为此集合的所有引用并进行设置。Set<...>

以下代码表示我的映射:

@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
    return this.children;
}

我试图清理套装<..根据这一点,>:如何“可能”解决问题,但它不起作用。

如果您有任何想法,请告诉我。

谢谢!


答案 1

检查您要为sonEntities分配某些内容的所有位置。您引用的链接明确指出了创建新的 HashSet,但每当您重新分配该哈希集时,都可能出现此错误。例如:

public void setChildren(Set<SonEntity> aSet)
{
    this.sonEntities = aSet; //This will override the set that Hibernate is tracking.
}

通常,您只想在构造函数中“新建”一次集合。每当要在列表中添加或删除某些内容时,都必须修改列表的内容,而不是分配新列表。

要添加子项:

public void addChild(SonEntity aSon)
{
    this.sonEntities.add(aSon);
}

要删除子项:

public void removeChild(SonEntity aSon)
{
    this.sonEntities.remove(aSon);
}

答案 2

方法:

public void setChildren(Set<SonEntity> aSet) {
    this.sonEntities = aSet;
}

如果 分离,则工作,如果我们更新它,则再次工作。
但是,如果实体未与每个上下文分离(即查找和更新操作位于同一事务中),则以下方法有效。parentEntity

public void setChildren(Set<SonEntity> aSet) {
    //this.sonEntities = aSet; //This will override the set that Hibernate is tracking.
    this.sonEntities.clear();
    if (aSet != null) {
        this.sonEntities.addAll(aSet);
    }
}

推荐