在OneToMany中识别子null并从数据库中删除的更好方法是什么?

时间:2016-06-29 11:49:48

标签: java hibernate

我有一个RESTFul系统,我遇到了两个类(父和子)的问题,这些类有for (int i = 0; i < list.size(); i++) @OneToMany关系,如:

@ManyToOne

Ps。:我正在使用Hibernate 4.3

问题是:

我已经拥有数据库中的对象,如:

//Parent
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "parent", orphanRemoval = true)
private Collection<Child> childCollection;

//Child
@ManyToOne(optional = false)
@JoinColumn(name = "ID_PARENT", referencedColumnName = "ID_PARENT")
private Parent parent;

我发送了一个JSON,如:

Parent         Child
ID | NAME      ID | PARENT | NAME
1  | Test      1  | 1      | Child1
               2  | 1      | Child2

我只是这样做:

{
    "id": 1,
    "name": "test",
    "childCollection": null
}

我收到了以下错误:

  

不再引用cascade =“all-delete-orphan”的集合   由拥有实体实例

为什么???有人能帮助我吗?

1 个答案:

答案 0 :(得分:3)

Hibernate需要父对象中子集合的完全所有权。如果将其设置为null,则Hibernate无法跟踪对该集合的更改,因此无法知道如何将级联持久性应用于对象。

您的父实体必须是托管实例。在您的情况下,您可以通过在合并调用之前查询实体来完成此操作。在此之后,如果要清除父项中的所有子元素,则必须调用parent.getChildCollection().clear()而不是将集合设置为null。通过这种方式,Hibernate实际上是在跟踪子集合。最后进行session.merge()调用,不得出现错误。

有关此内容的更多信息:

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