Скажем, например, у меня было две сущности: Article
и Tag
(как в типичном блоге). Каждая статья может иметь много тегов, и каждый тег может использоваться многими статьями, так что это классическое отношение m: n.
Мне нужно указать сторону-владельца в JPA. Но какая сторона должна быть владельцем? Статья не зависит от определенного тега и наоборот. Есть ли эмпирическое правило для определения, какая сторона должна быть стороной-владельцем?
Для каждой двунаправленной связи требуется сторона-владелец в JPA. В частном случае ManyToMany
:
@JoinTable
указывается на стороне-владельце отношения.
Из спецификации JPA:
9.1.26 Аннотация ManyToMany
Каждая ассоциация «многие ко многим» имеет два стороны, владеющая сторона и не владеющая, или обратная сторона. Соединение таблица указывается на стороне-владельце. Если ассоциация двунаправленная, любая сторона может быть обозначена как сторона собственника.
Также стоит упомянуть, что в JPA сторона-владелец не подразумевает содержащую сторону или сторону, которая владеет другими объектами. Подробнее об этом здесь: Что означает «обратная сторона ассоциации» в двунаправленной ассоциации JPA OneToMany / ManyToOne?
моя точка зрения:
это зависит от вашего бизнеса. какая организация более важна для вашего бизнеса.
в вашем примере, я думаю, статья должна быть владельцем,
В 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;