外键上的单向一对多关联是一种不常见的情况,不建议这样做。而是文档 建议使用连接表进行单向1对M。
我不确定为什么文档说它是不寻常的情况而不推荐。因为根据我的经验,这是很常见的情况,如客户
可以在银行中拥有多个帐户,因此客户与帐户之间将存在one-to-many
关系,客户将与之建立关联
帐户将是该客户的帐户集合。
那么为什么我们需要在这种情况下引入连接表?
答案 0 :(得分:4)
@Alex说的是正确的。这个答案有两个部分。
我也觉得案件并不罕见。但是,根据您的示例,如果Customer
的集合Account
支持该方案。 但是在示例帐户中,如果没有客户,则不能存在。。考虑另一种情况,其中集合项独立于所有者。
说出Owner
和Car
之间的关系。所有者拥有许多汽车,因此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