JPA: какая сторона должна быть стороной-владельцем в отношениях m: n? - PullRequest
10 голосов
/ 14 августа 2010

Скажем, например, у меня было две сущности: Article и Tag (как в типичном блоге). Каждая статья может иметь много тегов, и каждый тег может использоваться многими статьями, так что это классическое отношение m: n.

Мне нужно указать сторону владения с JPA. Но какая сторона должна быть владельцем? Статья не зависит от определенного тега и наоборот. Есть ли эмпирическое правило для определения, какая сторона должна быть стороной-владельцем?

Ответы [ 6 ]

10 голосов
/ 15 августа 2010

Каждое двунаправленное отношение требует наличия собственной стороны в JPA. В частном случае ManyToMany:

  • @JoinTable указано на стороне-владельце отношений.
    • сторона-владелец произвольно , вы можете выбрать любую из двух сущностей в качестве владельца.

Из спецификации JPA:

9.1.26 ManyToMany Аннотация

Каждая ассоциация многих ко многим имеет два стороны, владеющая сторона и не владеющая или обратная сторона. Соединение Таблица указана на стороне владельца. Если ассоциация является двунаправленной, любая сторона может быть обозначена как владеющая сторона.

6 голосов
/ 01 ноября 2010

Вы выбираете сторону-владельца, учитывая, где вы хотите обновить ассоциацию. Вы можете обновить ассоциацию de ManyToMany только в одном месте (сторона-владелец). Поэтому выбор зависит от того, как вы хотите управлять / обновлять поля вашей ассоциации.

1 голос
/ 15 августа 2010

Также стоит упомянуть, что в JPA сторона владения не подразумевает сторону сдерживания или сторону, которая владеет другими объектами. Подробнее об этом здесь: В двунаправленной ассоциации JPA OneToMany / ManyToOne, что подразумевается под "обратной стороной ассоциации"?

1 голос
/ 14 августа 2010

моя точка зрения:

это зависит от вашего бизнеса. какая организация важнее в вашем бизнесе.

в вашем примере, я думаю, статья должна быть стороной,

0 голосов
/ 11 апреля 2018

При каждом отображении M: N, т. Е. При двунаправленном отображении, мы используем @ManyToMany и @JoinTable в нашем коде.

Чтобы ответить на этот вопрос «Какая сторона должна владеть отношениями», вернемся к созданным вами моделям и тому, как данные должны храниться в базе данных.
Как правило, изменения распространяются в базе данных только со стороны владельца отношения.Позвольте мне объяснить в соответствии с вашим примером,

Есть две таблицы / модели / POJOs, Article и Tag.
Всякий раз, когда публикуется Post, устанавливается связь с Tags.
Или Когда публикуется Book, связь с Author
Итак, @JoinColumn должно идти в Post в вашем случае.

0 голосов
/ 14 августа 2010

В MHO это типичный случай, когда требуется соотношение @ManyToMany.

Если вы используете Join Table, вы можете иметь в своем классе Article что-то вроде.

@ManyToMany 
@JoinTable(name="TAG_ARTICLE", 
      joinColumns=@JoinColumn(name="ARTICLE_ID"),
      inverseJoinColumns=@JoinColumn(name="TAG_ID"))
private Collection<Tag> tags;

Тогда в вашем классе тегов

@ManyToMany(mappedBy="tags")
private Collection<Article> articles;
...