Сохранить модель с отношением OneToMany - PullRequest
3 голосов
/ 16 мая 2011

Привет, у меня есть такие модели:

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 Ответ

1 голос
/ 29 февраля 2012

У меня была очень похожая проблема сегодня.

Проблема в том, что вы не можете просто назначить новую коллекцию в список «информация», потому что тогда Hibernate запутается. Play делает это автоматически, когда вы используете Person в качестве параметра в контроллере. Чтобы решить эту проблему, вам нужно изменить методы получения и установки информации так, чтобы она не создавала новую коллекцию / список.

Это самое простое решение, которое я нашел до сих пор:

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