Как отладить «Найдено два представления одной и той же коллекции»?

Я нашел несколько вопросов об этом , но ни одного с полным объяснением проблемы , и как его отлаживать - ответы анекдотичны.

Проблема в том, что в тесте Play 1.2.4 JPA я получаю это исключение, когда save () модель:

org.hibernate.HibernateException: обнаружены два представления одного и того же Коллекция: модели.Позиция.projects

Я хотел бы знать:

  1. Есть ли вообще документация по этой проблеме, не имеющая отношения к Play? Проблема находится в спящем режиме, но многие результаты Google по этому поводу находятся в приложениях Play.
  2. Каковы основные рекомендации, позволяющие избежать этой проблемы?
  3. Это вызвано игрой? Или что-то делаю не так?
  4. Как решить в моем конкретном случае?

Вот репродукция проблемы на github . У меня четыре объекта:

@Entity
public class Person extends Model {
    public String name;

    @OneToMany(cascade = CascadeType.ALL)
    public List positions;
}


@Entity
public class Position extends Model {
    public Position(){}
    public Position(Company companies) {
        this.companies = companies;
        this.projects = new ArrayList();
    }

    @OneToOne
    public Company companies;

    @ManyToOne
    public Person person;

    @OneToMany
    public List 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 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();

Кстати, я пробовал добавить модуль Игровые ассоциации , как предложил один человек, и, похоже, это не помогает.

Я вижу, что действительно созданные таблицы в некотором смысле дублируются:

У меня есть таблица person_position и таблица position , где обе содержат похожие поля: person_position содержит Person_id и position_id , а таблица position содержит id (то есть идентификатор позиции), person_id и company_id . Итак, я понимаю, что мое определение модели создает некоторую непреднамеренную избыточность, но я действительно не понимаю, как ее решить.

Я думал, что это может быть связано с двунаправленным отображением, но вот ветвь , где модель является однонаправленной (я удалил некоторые обратные ссылки) - и проблема все еще возникает.

14
задан Community 23 May 2017 в 10:31
поделиться