Hibernate,OneToOne单个外键引用

时间:2013-10-05 16:51:01

标签: java sql hibernate relational-database

我的数据库技能有点生疏,所以学习Hibernate对我来说有点困难。

我一直在阅读一对一,一对多和多对多,简而言之,这是我年轻时所理解的:

一对一的: - 表A链接到表B中的另一行,表A中的行数必须等于表B中的行数。

一对多的: - 每家公司都可以有很多员工。

许多一对多: - 许多医生可以拥有/分享各种患者。 (没有双关语)。

假设我有以下表格,用于承办者客户模型

表人:

[id [pk],fullname(char),age(int),address(char),sendFlowers(boolean),country_id [fk],whenDead_id [fk]]

1,'Martin Jensen',91,'Notlucky Street 4',false,2,1

2,'Killer Klaus',67岁,'Die-Hard Strasse 9',真实,1,2

2,'Bingo Man',46,'秘密地址',真实,1,2

表:国家/地区

[id [pk],name(char)]


1,'德国'

2,'朝鲜'

表:WhenDead


[id [pk],actionToTake(char)]

1,'忽略/不可能拾取'

2,'Cremate /模仿亲属和收集保险'

在正常情况下,如果我需要这些表中的一些信息,我会使用纯SQL来连接两个外键。 (fx描述,而不仅仅是id)。 每个人只能连接到一个国家和一个WhenDead表,但是,多个人当然应该能够引用相同的外键值,以避免重复。

我尝试在Hibernate中使用@OneToOne注释,这两个表的列名称作为实体上的外键ID。然而,它似乎与OneToOne所代表的相反......“表中的每一行在另一个表中都有对应的行”和“行数,必须在两个表中匹配”。

使用一对多或多对多似乎不自然。

有人可以推动我朝着正确的方向前进,或者我应该继续使用OneToOne,每个印度的hibernate教程都说“除非你有一个大的设计缺陷,否则永远不会被使用”

1 个答案:

答案 0 :(得分:1)

你弄错了,你忘记了一种关联:ManyToOne。

我们举个例子:

  • 从A到B的OneToOne:A有0或者一个B,B不能与几个As关联。因此,两个表中的行数不一定相同。示例:一辆车有一个车牌号(如果尚未售出,则为0)。 OneToOne确实非常罕见,我很难找到一个例子。

  • OneToMany:一个A有0,1或几个B(s)。示例:公司有很多员工。

  • ManyToOne:A有0或者一个B,B可以与几个As相关联。例如:一个人有一个父亲(父亲可能有几个孩子)。

  • ManyToMany:A有0,1或几个B,B可以与0,一个或几个As相关联。典型的例子:一个学生有很多课程,一个课程后面跟着几个学生。

因此,对于您的表/实体,您有以下关联:

  • 人 - ManyToOne - 国家
  • Person - ManyToOne - WhenDead

事实上,有几个人住在同一个国家,但一个人住在0或1个国家。有些人可能希望被火化(不确定这是正确的英语),但一个人不能同时被火化和埋葬。

当然,你可以选择使这些关联成为双向的,甚至只能在另一个方向上实现它们。在这种情况下,你会有

  • 国家 - OneToMany - 人
  • WhenDead - OneToMany - Person

简而言之,每次从一个表到另一个表都有外键时,您就拥有了ManyToOne或OneToOne关联。如果可以对外键设置唯一约束,则它是OneToOne,因为可以保证第一个表的两行不能引用目标表的同一行。否则,它是一个ManyToOne。