JPA: Как мне создать сущность с несколькими детьми и несколькими родителями одного типа сущности? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь смоделировать бизнес-объект, в котором указанный бизнес может иметь несколько родительских предприятий и несколько дочерних предприятий. Я не уверен, какие отношения подходят, или даже какое отображение подходит. Я знаком с SQL, но плохо знаком с ORM в Java.

Я думаю, что в бизнесе может быть много или нет детей, а в бизнесе может быть много или вообще нет родителей. Поэтому я попытался установить как OneToMany, так и OneToMany, и оба привели к этой ошибке: Illegal use of mappedBy on both sides of the relationship.

Реализация:

@Entity
public class Business{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "parentOrgs")
    private Collection<Business> chlidOrgs;

    @OneToMany(mappedBy = "chlidOrgs")
    private Collection<Business> parentOrgs;

    // --- Getters and setters below ---

Что я здесь не понимаю? Любая помощь очень ценится.

1 Ответ

1 голос
/ 28 марта 2019

Ваше текущее отображение синтаксически неверно, потому что только одна сторона отношений может быть стороной-владельцем. Обладающая сторона - это поле, определяемое значением атрибута mappedBy. Более подробное объяснение можно найти по здесь .

Также удаление mappedBy с одной стороны не решает проблему, потому что аналог OneToMany должен быть ManyToOne. Удаление его с обеих сторон оставляет нам две однонаправленные ассоциации, что тоже не то, что нужно.

Поскольку у каждого Business может быть несколько родителей, и, по-видимому, предпочтительнее иметь возможность переходить непосредственно к детям, решение состоит в том, чтобы использовать двунаправленный ManyToMany:

@Entity
public class Business {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToMany(mappedBy = "parents")
  private Collection<Business> childrens;

  @ManyToMany
  private Collection<Business> parents;
}

С точки зрения базы данных это означает следующие таблицы:

Business(id)
Business_Business(childrens_id, parents_id)

При необходимости имя таблицы и столбцов соединения можно контролировать с помощью JoinTable .

...