【问题标题】:Difference Between Many to many , and Many to one in both tables两个表中多对多和多对一的区别
【发布时间】:2021-05-31 22:30:47
【问题描述】:

我有 2 个类,A 类和 B 类,它们之间存在多对多关系, 我想知道两者之间的区别:

  • 在两个类中进行多对多注解,Hibernate 将自动生成第三个类(我们将其命名为 C 类)。 还有...
  • 在两个类中进行多对一注释,并手动创建第三个类 C 类,迁移使用一对多注释的 A 类和 B 类的 2 个 ID。

它会影响我的 UML 类 Diagramme 吗?

【问题讨论】:

  • 什么是“休眠”?
  • @qwerty_so 我想是hibernate.org
  • @Christophe 也许。或者可能不是。如果人们在这里提出问题,他们将提出适当的问题,而这些问题本身不应受到质疑。解决这个问题并不难。
  • @qwerty_so 我认为 OP 放置了一个 hibernate 和一个 jpa 标记,它很好地设置了上下文,使它成为一个与 UML 问题一样的适当的休眠问题
  • @Christophe 我在这方面的专家不如你 ;-) 也许 jpa 就足够了。但是,如果有人向我提出 UML 问题,他需要更多地谈论 UML 而不是编码。我知道大多数编码人员只是关于“那个 UML”——只是一个负担。那么,没办法。双关语。

标签: java hibernate jpa annotations uml


【解决方案1】:

实现多对多关联

二元多对多关联有两端。一个关键问题是您希望能够导航到哪个方向:

  • 如果您只想从A 导航到B,您可以通过在A 的每个实例中存储对其相关B 实例的引用集合来实现关联。我们说 A 拥有 B 关联端。它是多对多的,因为没有什么能阻止B 的同一个实例在A 的不同实例中被多次引用。
  • 如果您想双向导航,即从AB 以及从BA。您可以复制此机制,并在每个B 实例中存储对其相关A 实例的引用集合。您需要多做一点来确保这两个集合之间的一致性。
  • 无论是双向还是单向,您也可以将关联外包。当作为关联类的多对多关联(即两个实体之间的链接被附加属性丰富)时,通常会这样做。

顺便说一下,最后一个实现选项与模型的实现非常相似,该模型将引入与 A 和 B 具有多对一关系的中间类 C。(“相似”但不是“等效”,因为UML 允许在多对多关联中重复链接)

多对多和ORM

ORM 的上下文中,例如hibernate,最后一种方法是一种流行的映射策略,即使没有关联类。为了简化:

  • A 类将映射到 TA 表,B 映射到 TB 表,以及与 TA_B 表的多对多关联,也称为“join -table"(用 hibernate-speak,或更一般的通用语言关联表)。
  • 此关联表为A 实例和B 实例之间的每个链接保存一对ID。关系模式允许使用此表进行有效的双向导航。因此,如果您有任何A,一个简单的查询就会为您提供所有相关的Bs,反之亦然,此外,由于它是同一张表的同一行,因此双方在机械上保持同步。

但是,如果一个实体对关联一无所知,它就无法找到元素和规则以在另一个方向上导航。所以这都是关于 ORM 层能找出什么以及你准备接受什么依赖的问题。

结论:Hibernate 案例

我不是休眠专家,但根据我对 ORM 和documentation 的了解,@ManyToMany 注释似乎:

  • 只能在关联的一侧使用,但只能从这一侧进行单向导航(请参阅documentation,特别是“2.2.5.3.2.2. 默认值”部分,第一个例子)。
  • 应用于关联的两侧以启用双向导航(例如,参见“2.2.5.3.2.1. 定义”部分)。

如果您为自己创建一个具有多对一关联的 C 类,则您使用的是稍微不同的模型,它满足了相同的需求。

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 2013-11-07
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多