gpt4 book ai didi

hibernate - 保存具有 OneToMany 关系的模型

转载 作者:行者123 更新时间:2023-12-04 03:53:39 25 4
gpt4 key购买 nike

你好
我有这样的模型:

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

我的 Controller 中有一个这样的方法:
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

我不明白错误消息,因为如果列表以前为空,它就会出现。

最佳答案

我今天有一个非常相似的问题。

问题是您不能只将新集合分配给“信息”列表,因为这样 Hibernate 会感到困惑。当您在 Controller 中使用 Person 作为参数时,Play 会自动执行此操作。要解决这个问题,您需要修改“信息”的 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);
}
}
// ...
}

然后在你的 Controller 中:
public static void savePerson(Person person) {
person.merge();
person.save();
renderJSON(person);
}

关于hibernate - 保存具有 OneToMany 关系的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com