比如说,我有两个实体:Article
和Tag
(就像典型的博客一样)。每篇文章都有很多标签,每个标签都可以被很多文章使用,所以它是一种经典的m:n关系。
我需要用JPA指定一个拥有方。但哪一方应该是拥有方呢?文章不依赖于某个标签,反之亦然。是否有一个经验法则来确定哪一方应该是拥有方?
答案 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,Article
和Tag
。
每当发布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;