JPA: какая сторона должна быть владением в отношении m: n?
Например, у меня было две сущности: Article
и Tag
(как в типичном блоге). Каждая статья может иметь много тегов, и каждый тег может использоваться многими статьями, так что это классическое отношение m: n.
Мне нужно указать сторону владения с JPA. Но какая сторона должна быть владельцем? Статья не зависит от определенного тега и наоборот. Есть ли эмпирическое правило для определения, какая сторона должна быть стороной-владельцем?
Ответы
Ответ 1
Каждые двунаправленные отношения требуют участия в JPA. В частном случае ManyToMany
:
-
@JoinTable
указывается на стороне владельца отношения.
- владеющая сторона произвольная, вы можете выбрать любое из двух объектов, которые будут владельцем.
Из спецификации JPA:
9.1.26 ManyToMany Annotation
Каждая ассоциация "многие-ко-многим" имеет два стороны, владеющая сторона и не владеющий или обратный. Присоединение таблица указана на стороне владельца. Если ассоциация двунаправлена, обе стороны могут быть обозначены как владеющей стороной.
Ответ 2
Вы выбираете сторону владельца, рассматривая, где вы хотите, чтобы ассоциация обновлялась. Вы можете обновить ассоциацию ManyToMany только в одном месте (владеющая сторона). Поэтому выбор зависит от того, как вы хотите управлять/обновлять поля ассоциации.
Ответ 3
моя точка зрения:
это зависит от вашего бизнеса. какая организация важнее в вашем бизнесе.
в вашем примере, я думаю, что статья должна быть владельцем,
Ответ 4
Также стоит упомянуть, что в JPA сторона-владелец не подразумевает содержащую сторону или сторону, которая владеет другими объектами. Подробнее об этом здесь: В двунаправленной ассоциации JPA OneToMany/ManyToOne, что подразумевается под "обратной стороной ассоциации" ,
Ответ 5
Всякий раз, когда есть отображение M: N, т.е. есть двунаправленное отображение, мы используем @ManyToMany
и @JoinTable
в нашем коде.
Чтобы ответить на этот вопрос "Какая сторона должна владеть отношениями", вернемся к моделям, которые вы создаете, и как данные должны храниться в базе данных.
Как правило, изменения распространяются на базу данных только со стороны владельца отношения. Позвольте мне объяснить в соответствии с вашим примером,
Есть две таблицы/модели /POJOs, Article
и Tag
.
Всякий раз, когда Post
публикуется, устанавливается связь с Tags
.
Или всякий раз, когда Book
публикуется, устанавливается связь с Author
.
Итак, @JoinColumn
должен идти в Post
в вашем случае.
Ответ 6
В MHO это типичный случай, когда требуется отношение @ManyToMany
.
Если вы используете таблицу объединений, вы можете иметь в своем классе статьи что-то вроде.
@ManyToMany
@JoinTable(name="TAG_ARTICLE",
[email protected](name="ARTICLE_ID"),
[email protected](name="TAG_ID"))
private Collection<Tag> tags;
Затем в вашем классе тегов
@ManyToMany(mappedBy="tags")
private Collection<Article> articles;