使用OneToMany关系保存模型

时间:2011-05-16 07:50:28

标签: 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 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

我不理解错误消息,因为如果列表以前是空的,则会显示错误消息。

1 个答案:

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