JPA: какая сторона должна быть стороной-владельцем в отношениях am: n?

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

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

10
задан Sofia Paixão 17 December 2018 в 21:24
поделиться

4 ответа

Для каждой двунаправленной связи требуется сторона-владелец в JPA. В частном случае ManyToMany :

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

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

9.1.26 Аннотация ManyToMany

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

10
ответ дан 3 December 2019 в 21:19
поделиться

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

1
ответ дан 3 December 2019 в 21:19
поделиться

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

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

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

1
ответ дан 3 December 2019 в 21:19
поделиться

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

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

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

Затем в классе Tag

@ManyToMany(mappedBy="tags")
private Collection<Article> articles;
-1
ответ дан 3 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: