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

Posted

技术标签:

【中文标题】JPA:在 m:n 关系中,哪一方应该是拥有方?【英文标题】:JPA: which side should be the owning side in a m:n relationship? 【发布时间】:2010-08-14 17:11:52 【问题描述】:

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

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

【问题讨论】:

我假设“to”是指“两个”?您可以考虑编辑您的帖子以使其更易于阅读。 【参考方案1】:

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

@JoinTable 在关系的拥有方指定。 拥有方是任意,您可以选择两个实体中的任何一个作为拥有者。

来自 JPA 规范:

9.1.26 多对多注解

每个多对多关联都有两个 双方,拥有方和 非拥有方或反向方。加入 表在拥有方指定。 如果关联是双向的, 任何一方都可以被指定为 拥有方。

【讨论】:

JPA 1.0 Specification 下载页面为您提供方便。【参考方案2】:

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

【讨论】:

【参考方案3】:

我的观点:

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

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

【讨论】:

【参考方案4】:

另外值得一提的是,在 JPA 中,拥有方并不意味着包含方或拥有其他实体的一方。更多信息在这里:In a bidirectional JPA OneToMany/ManyToOne association, what is meant by "the inverse side of the association"?

【讨论】:

【参考方案5】:

只要存在 M:N 映射,即存在双向映射,我们就会在代码中使用 @ManyToMany@JoinTable。 要回答“哪一方应该拥有关系”这个问题,请回到您创建的模型以及数据应如何存储在数据库中。 通常,更改仅从关系的所有者传播到数据库。让我按照你的例子解释一下, 有两个表/模型/POJO,ArticleTag每当发布Post 时,都会与Tags 建立关系。 或者,每当发布 Book 时,都会建立与 Author 的关系。 因此,在您的情况下,@JoinColumn 应该进入 Post

【讨论】:

【参考方案6】:

在 MHO 中,这是需要 @ManyToMany 关系的典型情况。

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

@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;

【讨论】:

谢谢你的例子。但是为什么mappedBy 属性在Tag 类中而不在Article 类中呢? 不是问题的答案。

以上是关于JPA:在 m:n 关系中,哪一方应该是拥有方?的主要内容,如果未能解决你的问题,请参考以下文章

Java JPA ORM 一对多 多对一

jpa关联映射(一)

确定 Hibernate 中哪个类拥有方

hibernate的注解属性mappedBy详解

hibernate的注解属性mappedBy详解

决定哪个类在Hibernate中是拥有方