一对多、多对一和多对多之间的区别?

2022-08-31 06:16:56

好吧,这可能是一个微不足道的问题,但我在可视化和理解差异以及何时使用每个差异时遇到了麻烦。我也有点不清楚单向和双向映射等概念如何影响一对多/多对多关系。我现在正在使用Hibernate,所以任何与ORM相关的解释都会有所帮助。

举个例子,假设我有以下设置:

public class Person {
    private Long personId;
    private Set<Skill> skills;
    //Getters and setters
}

public class Skill {
    private Long skillId;
    private String skillName;
    //Getters and setters
}

那么在这种情况下,我会有什么样的映射呢?这个具体示例的答案绝对值得赞赏,但我也非常希望概述何时使用一对多和多对多,何时使用连接表与连接列以及单向与双向。


答案 1

看起来每个人都在回答 vs.One-to-manyMany-to-many

和 的区别是:One-to-manyMany-to-oneMany-to-Many

一对多多对一是一个视角问题。 vs 不会影响映射,但会对您如何访问数据产生影响。UnidirectionalBidirectional

  • 在侧面将保留侧面的参考。一个很好的例子是“一个州有城市”。在这种情况下,是一面,是多面。表中将有一列。Many-to-onemanyoneStateCitystate_idcities

单向中,类将具有 ,但不会具有 。在双向中,两个属性都被添加,它允许您访问给定的技能(即 )。PersonList<Skill> skillsSkillPerson personPersonskill.person

  • 一方面将是我们的参照点。例如,“用户有地址”。在这种情况下,我们可能有三列 ,和/或一个查找,对 on 有多列唯一约束One-to-Manyaddress_1_idaddress_2_idaddress_3_iduser_idaddress_id

单向中,a 将具有 .双向类中将有一个附加项。UserAddress addressList<User> usersAddress

  • 在每一方的成员中可以持有任意数量的另一方的成员。为此,使用查找表。这方面的例子是医生和病人之间的关系。医生可以有很多病人,反之亦然。Many-to-Many

答案 2

一对多:一个人有很多技能,一个技能不会在人与人之间重复使用

  • 单向:一个人可以通过其集合直接参考技能
  • 双向:每个“子”技能都有一个指向该人员的指针(未显示在代码中)

多对多:一个人拥有多种技能,一项技能在人与人之间重复使用

  • 单向:一个人可以通过其集合直接参考技能
  • 双向:技能有一组与之相关的人员。

在一对多关系中,一个对象是“父对象”,一个是“子对象”。父级控制子项的存在。在多对多中,任何一种类型的存在都依赖于它们之外的东西(在更大的应用程序上下文中)。

你的主题(领域)应该决定这种关系是一对多还是多对多 - 但是,我发现使关系单向或双向是一个工程决策,它权衡了内存,处理,性能等。

令人困惑的是,多对多双向关系不需要对称!也就是说,一群人可以指着一项技能,但这种技能不需要仅仅与那些人联系起来。通常这样,但这种对称性不是必需的。以爱为例 - 它是双向的(“I-Love”,“Loves-Me”),但通常是不对称的(“我爱她,但她不爱我”)!

所有这些都得到了Hibernate和JPA的良好支持。请记住,Hibernate或任何其他ORM在管理双向多对多关系时不会对保持对称性嗤之以鼻......这完全取决于应用程序。


推荐