JPA: какая сторона должна быть владением в отношении m: n?

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

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

Ответ 1

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

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

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

9.1.26 ManyToMany Annotation

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 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;