JPA:哪一方应该是m:n关系的拥有方?

时间:2010-08-14 17:11:52

标签: java orm jpa many-to-many

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

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

6 个答案:

答案 0 :(得分:10)

每个双向关系都需要JPA中的拥有方。在ManyToMany

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

来自JPA规范:

  

9.1.26 ManyToMany注释

     

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

答案 1 :(得分:6)

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

答案 2 :(得分:1)

我的观点:

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

每当存在M:N映射,即存在双向映射时,我们在代码中使用@ManyToMany@JoinTable

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

有两个表/模型/ POJO,ArticleTag
每当发布Post时,都会与Tags建立关系。
或者,每当发布Book时,都会与Author建立关系。
因此,@JoinColumn应该在您的情况下进入Post

答案 5 :(得分:-1)

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