Я нашел несколько вопросов о этом, но нет ни одного с полным объяснением проблемы и как ее отладить - все ответы анекдотичны.
Проблема в том, что в тесте Play 1.2.4 JPA я получаю это исключение, когда я save()
модель:
org.hibernate.HibernateException: Foundдва представления одной коллекции: models.Position.projects
Я хотел бы знать:
- Есть ли документация по этой проблеме в целом, не связанная с Play?Проблема в спящем режиме, но многие результаты Google по этому вопросу находятся в приложениях Play.
- Каковы основные рекомендации по устранению этой проблемы?
- Это вызвано Play?Или я что-то не так делаю?
- Как решить в моем конкретном случае?
Вот воспроизведение проблемы на github .У меня есть четыре объекта:
@Entity
public class Person extends Model {
public String name;
@OneToMany(cascade = CascadeType.ALL)
public List<Position> positions;
}
@Entity
public class Position extends Model {
public Position(){}
public Position(Company companies) {
this.companies = companies;
this.projects = new ArrayList<Project>();
}
@OneToOne
public Company companies;
@ManyToOne
public Person person;
@OneToMany
public List<Project> projects;
}
@Entity
public class Company extends Model {
public String name;
}
@Entity
public class Project extends Model {
public Project(){}
public Project(String field, String status){
this.theField = field;
this.status = status;
}
@ManyToOne
public Position position;
public String theField;
public String status;
}
И мой код персистентности:
Company facebook = new Company();
facebook.name = "Facebook";
facebook.save();
Company twitter = new Company();
twitter.name = "Twitter";
twitter.save();
Person joe = new Person();
joe.name = "Joe";
joe.save();
joe.positions = new ArrayList<Position>();
Position joeAtFacebook = new Position(facebook);
joeAtFacebook.projects.add(new Project("Stream", "Architect"));
joeAtFacebook.projects.add(new Project("Messages", "Lead QA"));
joe.positions.add(joeAtFacebook);
Position joeAtTwitter = new Position(twitter);
joeAtTwitter.projects.add(new Project("Steal stuff from Facebook", "CEO"));
joe.positions.add(joeAtTwitter);
joe.save();
Кстати, я пытался добавить модуль Play ассоциаций , как предложил один человек,и это, похоже, не помогает.
Я вижу, что действительно, создаваемые таблицы в некотором смысле дубликаты:
У меня есть и таблица person_position
, и position table
,где оба содержат одинаковые поля: person_position
содержит Person_id
и positions_id
, а таблица position
содержит id
(значение идентификатора позиции), person_id
и companies_id
.Поэтому я понимаю, что некое непреднамеренное резервирование создается моим определением модели, но я не совсем понимаю, как его решить.
Я думал, что это может быть связано с двунаправленным отображением, но вот ветвь , где модель однонаправленная (я удалил некоторые обратные ссылки) - и проблема все еще возникает.