您好 我有这样的模型:
public class Person extends Model {
...
@OneToMany(orphanRemoval = true, mappedBy = "person")
@Cascade({ CascadeType.ALL })
public List<Contact> infos = new ArrayList<Contact>();
}
public class Contact extends Model {
...
@ManyToOne(optional = false)
public Person person;
}
我的控制器中有一个方法,如下所示:
public static void savePerson(Person person) {
person.save();
renderJSON(person);
}
我的问题是,当我尝试使用savePerson()保存一个人时,我有这个错误(仅当我的Person列表不为空时):
PersistenceException occured : org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: models.Person.infos
我不理解错误消息,因为如果列表以前是空的,则会显示错误消息。
答案 0 :(得分:1)
今天我遇到了一个非常类似的问题。
问题在于,您无法将新收藏品分配给“信息”。列表,因为那时Hibernate会感到困惑。当您将Person用作控制器中的参数时,Play会自动执行此操作。要解决此问题,您需要修改&#39; infos&#39;的getter和setter。这样它就不会实例化一个新的Collection / List。
这是我迄今为止找到的最简单的解决方案:
public class Person extends Model {
// ...
public List<Contact> getInfos() {
if (infos == null) infos = new ArrayList<Contact>();
return infos;
}
public void setInfos(List<Contact> newInfos) {
// Set new List while keeping the same reference
getInfos().clear();
if (newInfos != null) {
this.infos.addAll(newInfos);
}
}
// ...
}
然后在你的控制器中:
public static void savePerson(Person person) {
person.merge();
person.save();
renderJSON(person);
}