Java JPA:在m:n关系中,哪一方应该是拥有方?

Java JPA:在m:n关系中,哪一方应该是拥有方?,java,orm,jpa,many-to-many,Java,Orm,Jpa,Many To Many,比如说,我有两个实体:文章和标签(就像在一个典型的博客中)。每一篇文章可以有很多标签,每个标签可以被很多文章使用,所以这是一个经典的m:n关系 我需要用JPA指定一个拥有方。但哪一方应该是拥有方?文章不依赖于某个标签,反之亦然。是否有经验法则来确定哪一方应该是拥有方?在MHO中,这是一个典型的情况,其中需要一个@manytomy关系 如果使用联接表,则可以在文章类中包含类似的内容 @ManyToMany @JoinTable(name="TAG_ARTICLE", joinCol

比如说,我有两个实体:
文章
标签
(就像在一个典型的博客中)。每一篇文章可以有很多标签,每个标签可以被很多文章使用,所以这是一个经典的m:n关系


我需要用JPA指定一个拥有方。但哪一方应该是拥有方?文章不依赖于某个标签,反之亦然。是否有经验法则来确定哪一方应该是拥有方?

在MHO中,这是一个典型的情况,其中需要一个
@manytomy
关系

如果使用联接表,则可以在文章类中包含类似的内容

@ManyToMany 
@JoinTable(name="TAG_ARTICLE", 
      joinColumns=@JoinColumn(name="ARTICLE_ID"),
      inverseJoinColumns=@JoinColumn(name="TAG_ID"))
private Collection<Tag> tags;
@manytomy
@JoinTable(name=“TAG\u ARTICLE”,
joinColumns=@JoinColumn(name=“ARTICLE\u ID”),
inverseJoinColumns=@JoinColumn(name=“TAG\u ID”))
私人收藏标签;
然后在标签类中

@ManyToMany(mappedBy="tags")
private Collection<Article> articles;
@ManyToMany(mappedBy=“tags”)
私人收藏物品;
我的观点:

这取决于你的生意。哪个实体在您的业务中更重要


在您的示例中,我认为文章应该是拥有方,

每个双向关系都需要JPA中的拥有方。在
manytomy
的特殊情况下:

  • @JoinTable
    在关系的拥有方指定。
    • 拥有方是任意的,您可以选择两个实体中的任何一个作为所有者
根据JPA规范:

9.1.26多个注释 每个多对多协会有两个 双方、拥有方和 非拥有方,或相反方。连接 表是在拥有方指定的。 如果关联是双向的, 任何一方都可以被指定为 拥有方


同样值得一提的是,在JPA中,拥有方并不意味着包含方或拥有其他实体的一方。关于这方面的更多信息:

您可以通过考虑在何处更新关联来选择拥有方。您只能在一个位置(拥有方)更新de ManyToMany关联。因此,选择取决于您希望如何管理/更新关联字段。

只要存在M:N映射,即存在双向映射,我们就在代码中使用
@manytomy
@JoinTable


要回答“哪一方应该拥有关系”这个问题,可以回到您创建的模型以及数据应该如何存储在数据库中。
通常,更改只从关系的所有者端传播到数据库。让我按照你的例子解释一下,

有两个表/模型/POJO,
Article
Tag

无论何时发布
帖子
,都会与
标签
建立关系。

或者,无论何时出版
书籍
,都会与
作者建立关系。


因此,在您的情况下,
@JoinColumn
应该放在
Post
中。

谢谢您的示例。但是为什么
mappedBy
属性在
Tag
类中,而不在
Article
类中?这不是问题的答案。我猜“to”是指“2”?您可能会考虑编辑您的帖子,使其更易于阅读。为了您的方便,下载页面。