我有一个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”的集合 由拥有实体实例
为什么???有人能帮助我吗?
答案 0 :(得分:3)
Hibernate需要父对象中子集合的完全所有权。如果将其设置为null
,则Hibernate无法跟踪对该集合的更改,因此无法知道如何将级联持久性应用于对象。
您的父实体必须是托管实例。在您的情况下,您可以通过在合并调用之前查询实体来完成此操作。在此之后,如果要清除父项中的所有子元素,则必须调用parent.getChildCollection().clear()
而不是将集合设置为null
。通过这种方式,Hibernate实际上是在跟踪子集合。最后进行session.merge()
调用,不得出现错误。
有关此内容的更多信息: