为什么外键上的单向一对多关联是一种不常见的情况,不推荐使用?

时间:2011-10-27 13:03:08

标签: hibernate hibernate-mapping

在链接http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/associations.html#assoc-unidirectional-m21,据说

  

外键上的单向一对多关联是一种不常见的情况,不建议这样做。而是文档   建议使用连接表进行单向1对M。

我不确定为什么文档说它是不寻常的情况而不推荐。因为根据我的经验,这是很常见的情况,如客户 可以在银行中拥有多个帐户,因此客户与帐户之间将存在one-to-many关系,客户将与之建立关联 帐户将是该客户的帐户集合。

那么为什么我们需要在这种情况下引入连接表?

3 个答案:

答案 0 :(得分:4)

@Alex说的是正确的。这个答案有两个部分。

我也觉得案件并不罕见。但是,根据您的示例,如果Customer的集合Account支持该方案。 但是在示例帐户中,如果没有客户,则不能存在。。考虑另一种情况,其中集合项独立于所有者。

说出OwnerCar之间的关系。所有者拥有许多汽车,因此one-to-many实体与Owner实体之间存在Car关系。数据库结构将是

Owner : [OwnerId, Name...]
Car   : [CarId, Name...., OwnerId]

这里我们假设 Car CAN不存在所有者。在这种情况下,将有null OwnerId的Car记录。 null的存在会降低信息的质量。降级意味着存储的信息质量会降低,因为存在未知数。上述结构可以重新建模为

 Owner    : [OwnerId, Name...]
 Car      : [CarId, Name....]
 CarOwner : [OwnerId,CarId]

因此,我们避免null中有Car个值条目,并且所有者和汽车之间的关联定义明确。

(正如@Alex正确指出的那样)
在Hibernate one-to-many中,关系不识别连接表因此我们使用many-to-many并将unique标志设置为true来映射关系。 但是请注意,引入连接表会不必要地增加连接数。

希望这个解释有所帮助。

答案 1 :(得分:1)

在Hibernate论坛上已经回答here

原因是您的映射声明关系的许多方面对其父级一无所知。但是在数据库术语中,实体具有一方的外键并且知道其父节点。因此,您的映射和数据库结构不一致。

使用连接表消除了这种不匹配。

答案 2 :(得分:0)

你的意思是?

table customer(id, idAccount)

id  |  idAccount
1         1
1         2

使用联接表:

table customer(id)

id |
 1

table join (idCustomer, idAccount)

idCustomer  | idAccount
     1            1
     1            2

检索Customer只会产生一行。由于Customer pojo将映射到db。{/ p>中的customer