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 【问题描述】:比如说,我有两个实体:Article
和 Tag
(就像在典型的博客中一样)。每篇文章可以有很多标签,每个标签可以被很多文章使用,所以是经典的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,Article
和Tag
。
每当发布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 关系中,哪一方应该是拥有方?的主要内容,如果未能解决你的问题,请参考以下文章