Hibernate - 具有 cascade=”all-delete-orphan” 的集合不再被拥有的实体实例引用

新手上路,请多包涵

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

 "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;
}

我试过只清理 Set<..>,根据这个: How to “possible” solve the problem 但它没有用。

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

谢谢!

原文由 axcdnt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

实际上,我的问题是关于我的实体的 equals 和 hashcode。遗留代码会带来很多问题,永远不要忘记检查它。我所做的只是保留删除孤儿策略并纠正等于和哈希码。

原文由 axcdnt 发布,翻译遵循 CC BY-SA 3.0 许可协议

检查您将某些东西分配给 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);
}

原文由 brainimus 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题