我见过人们用多对一的映射来表示一对一的关系.我也在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是映射一对一外键关联的方式(实际上可能比共享主键一对一关联更频繁).
最大的区别是,通过共享密钥一对一映射,两个对象彼此绑定在一起,它们一起存在。
例如,如果您创建绑定到具有相同名称的表的Person和Address类,则每个人将只有一个地址...
通过多对一的关系,表结构会有所变化,但可以实现相同的效果...
...甚至更多。现在此人可以有多个地址:
两个外键(addressid和shippingaddressid)可以指向一个数据库条目...或者一个地址可以属于2-3个人。所以从人的角度来看是一对多的,从地址的角度来说是一对多的。
只需猜测只有一项的一对多关联是什么样的?是的,就像一对一...
注意:地址实际上应该是一个值对象,不应该在数据库中共享(所以这是一个愚蠢的例子,但是我想会没事的)
简而言之: