Hibernate - 为什么要使用多对一来表示一对一?

abe*_*t80 43 orm hibernate

我见过人们用多对一的映射来表示一对一的关系.我也在Gavin King和一篇文章的书中读过这篇文章.

例如,如果客户可以只有一个送货地址,并且送货地址只能属于一个客户,则映射为:

<class name="Customer" table="CUSTOMERS">
    ...
    <many-to-one name="shippingAddress"
                 class="Address"
                 column="SHIPPING_ADDRESS_ID"
                 cascade="save-update"
                 unique="true"/>
    ...
</class>
Run Code Online (Sandbox Code Playgroud)

这本书的原因是(引用它):

"你不关心什么是对关联的目标方面,所以你可以把它像一个一对一的关联没有很多的一部分."

我的问题是,为什么要使用many-to-one而不是one-to-one?什么是一个one-to-one使它成为一个不太理想的选择many-to-one

谢谢.

Pas*_*ent 34

有几种方法可以在数据库中实现一对一关联:您可以共享主键,但也可以使用具有唯一约束的外键关系(一个表具有引用主键的外键列相关表格).

在后一种情况下,映射它的hibernate方法是使用many-to-one关联(允许指定外键).

原因很简单:你不关心关联的目标方面是什么,所以你可以像没有很多部分的一对一关系那样对待它.您只需要表达"此实体具有一个属性,该属性是对另一个实体的实例的引用",并使用外键字段来表示该关系.

换句话说,使用a many-to-one是映射一对一外键关联的方式(实际上可能比共享主键一对一关联更频繁).

  • 这似乎回答_when_但不是_why _...? (6认同)
  • 您能否提供一个示例来阐明您有关映射“具有唯一约束的外键关系”的观点?由于这种关系在逻辑上是一对一的,为什么在休眠状态下将其映射成多对一的关系? (2认同)

baH*_*aHI 6

最大的区别是,通过共享密钥一对一映射,两个对象彼此绑定在一起,它们一起存在。

例如,如果您创建绑定到具有相同名称的表的PersonAddress类,则每个人将只有一个地址...

  • 类Person->属性:地址
  • 表Person->列:ID,名称
  • 表格地址->列:ID,城市

通过多对一的关系,表结构会有所变化,但可以实现相同的效果...

  • 类Person->属性:地址
  • 表Person->列:ID,名称,地址ID(fk)
  • 表格地址->列:ID,城市

...甚至更多。现在此人可以有多个地址:

  • 类Person->属性:地址
  • 表Person->列:id,名称,地址id(fk),shippingaddressid(fk)
  • 表格地址->列:ID,城市

两个外键(addressid和shippingaddressid)可以指向一个数据库条目...或者一个地址可以属于2-3个人。所以从人的角度来看是一对多的,从地址的角度来说是一对多的。

只需猜测只有一项的一对多关联是什么样的?是的,就像一对一...

注意:地址实际上应该是一个值对象,不应该在数据库中共享(所以这是一个愚蠢的例子,但是我想会没事的)

简而言之:

  1. 或一一对应的映射比较难处理
  2. 一对一的局限性
  3. 相反,使用多对一会更灵活,并且可以通过