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

2022-09-03 18:05:14

我在理解 和 之间的区别时遇到了一些麻烦。当我使用它来创建一个JoinTable时,如果你添加mappedBy属性,你将在两个实体之间有双向关系。@OneToMany@ManyToMany@OneToMany

我有一个可能属于许多人,一个可能属于许多人。我不明白我是否应该使用,或者因为对我来说,它似乎完全相同,但事实可能并非如此。QuestionCategoriesCategoryQuestions@ManyToMany@OneToMany

有人能解释一下吗?


答案 1

好吧,区别在于您尝试使用对象反映的设计。

在你的情况下,每个都可以分配给多个 - 所以这是关系的标志。现在,您必须确定是否:QuestionCategories@*ToMany

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

@OneToMany(问题->类别)

只有当您显式定义 so using 或 当它是单向关系(其中拥有方是“一”侧)时,才能由连接表表示(这意味着在实体中您有一个集合,但在 您没有任何对 的引用)。@JoinTableQuestionCategoriesCategoriesQuestion

如果您仔细想想,使用联接表似乎非常合理。DBMS 没有其他方法可以保存表中的一行与表中的多行之间的连接。QuestionCategories

但是,如果要对双向关系进行建模,则需要指定(“多”方)是关系的拥有方。在这种情况下,DBMS 可以在表中创建具有外键的联接列,因为每行只能连接一个 。CategoryCategoryCategoryQuestion

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

@ManyToMany

此关系必须表示为联接表。它基本上与单向关系非常相似,但在这种情况下,您可能有多个行与 中的多个行联接。@OneToManyQuestionCategories


答案 2

@ManyToMany关系的两端都有相互参照的外键。有时,这种关系由相邻的表调解。

@OneToMany关系在“一”端有一个外键,而不是在“许多”一侧有一个外键。在@OneToMany关系中,一个对象是“父对象”,一个是“子对象”。父级控制子项的存在。

请记住,@ManyToMany双向关系不必是对称的!


推荐