使用@OneToMany和@ManyToMany之间的区别

Luc*_*uke 9 java jpa java-ee

我有一些无法理解的区别@OneToMany@ManyToMany.当我使用@OneToMany它时默认创建一个JoinTable,如果你添加mappedBy属性,你将在两个实体之间有双向关系.

我有一个Question可能属于许多人Categories,一个Category可能属于许多人Questions.我不明白我是否应该使用@ManyToMany@OneToMany因为对我而言似乎完全相同,但它可能不是.

有人可以解释一下吗?

Pio*_*cki 21

嗯,不同之处在于您尝试使用对象进行反映的设计.

在您的情况下,每个Question都可以分配到多个Categories- 这是一个@*ToMany关系的标志.现在你必须决定是否:

  • 每个Category只能Question分配一个(它将导致一个唯一的约束,这意味着没有其他类别可以引用相同的问题) - 这将是@OneToMany关系,
  • 每个都Category可以Questions分配多个(Category表中没有唯一约束) - 这将是@ManyToMany关系.

@OneToMany(问题 - >类别)

只有当你明确定义使用@JoinTable或当它是一个单向关系时,这个关系可以用连接表来表示,其中拥有方是'一方'(这意味着Question你在实体中有一个集合Categories,但在Categories你没有任何参考Question).

如果你考虑一下,使用连接表似乎是合理的.DBMS没有其他方法可以保存Question表中一行与表中多行之间的连接Categories.

但是,如果要建模双向关系,则需要指定Category('Many'侧)是关系的拥有方.在这种情况下,DBMS可以在Category表中创建具有外键的连接列,因为每Category行只能与一个连接Question.

通过这种方式,您没有任何连接表,只有简单的外键(仍然,如开头所指,您可以强制使用连接表@JoinTable).

@ManyToMany

此关系必须表示为连接表.它基本上与单向@OneToMany关系非常相似,但在这种情况下,您可能有多行来自Question连接多行Categories.