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

新手上路,请多包涵

好的,这可能是一个微不足道的问题,但我无法想象和理解差异以及何时使用它们。我也不太清楚单向和双向映射等概念如何影响一对多/多对多关系。我现在正在使用 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
}

那么在这种情况下,我会有什么样的映射?非常感谢对这个特定示例的回答,但我也非常想了解何时使用一对多和多对多以及何时使用连接表与连接列以及单向与双向。

原文由 Ian Dallas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 941
2 个回答

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

  • 单向:一个人可以通过它的集合直接引用技能
  • 双向:每个“子”技能都有一个指向 Person 的指针(您的代码中未显示)

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

  • 单向:一个人可以通过它的集合直接引用技能
  • 双向:一项技能有一组与之相关的人。

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

您的主题(领域)应该决定这种关系是一对多还是多对多——但是,我发现使关系成为单向或双向是一种权衡内存、处理、性能的工程决策, ETC。

令人困惑的是,多对多双向关系不需要对称!也就是说,一群人可以指向一项技能,但该技能不必仅与这些人相关。通常它会,但这种对称性不是必需的。以爱为例——它是双向的(“我爱”、“爱我”),但通常是不对称的(“我爱她,但她不爱我”)!

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

原文由 Dave 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

One-to-manyMany-to-oneMany-to-Many 之间的区别是:

One-to-many vs Many-to-one 是一个角度问题Unidirectional vs Bidirectional 不会影响映射,但会影响您访问数据的方式。

  • Many-to-one many 方面将保留 one 方面的参考。一个很好的例子是“A State has Cities”。在这种情况下 State 是一侧, City 是多侧。表中会有一列 state_id cities

单向 中,---- Skill Person 班级将具有 List<Skill> skills Person personbidirectional 中,添加了两个属性,它允许您访问 Person 给定技能(即 skill.person )。

  • One-to-Many 中,一侧将是我们的参考点。例如,“用户有地址”。 In this case we might have three columns address_1_id , address_2_id and address_3_id or a look up table with multi column unique constraint on user_id on address_id

单向 中,一个 User 将有 Address address双向 将在 Address 类中有一个额外的 List<User> users

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

原文由 Alexander Suraphel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题