Hibernate 使用关系“OneToMany”保存模型

Hibernate 使用关系“OneToMany”保存模型,hibernate,jpa,playframework,one-to-many,Hibernate,Jpa,Playframework,One To Many,嗨 我有这样的模型: public class Person extends Model { ... @OneToMany(orphanRemoval = true, mappedBy = "person") @Cascade({ CascadeType.ALL }) public List<Contact> infos = new ArrayList<Contact>(); } public class Contact extends Mode

嗨 我有这样的模型:

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()保存一个人时,我出现了以下错误(仅当我的个人列表不为空时):


我不理解错误消息,因为如果列表以前是空的或不是空的,它就会出现。

我今天遇到了一个非常类似的问题

问题是,您不能只将一个新集合分配给“infos”列表,因为这样Hibernate就会感到困惑。当您将Person用作控制器中的参数时,Play会自动执行此操作。要解决这个问题,您需要修改“infos”的getter和setter,这样它就不会实例化新的集合/列表

这是迄今为止我发现的最简单的解决方案:

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