我的数据库技能有点生锈,所以学习Hibernate有点困难。

简而言之,我一直在阅读一对一,一对多,多对多的内容,这是我从青年时代就了解的内容:

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

一对多:
-每个公司可以有很多员工。

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

假设我有以下表格,用于委托方客户模型

表人:

[id [pk],全名(字符),年龄(int),地址(字符),sendFlowers(布尔值),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,'Secret Address',true,1,2

表:国家

[id [pk],名称(字符)]



1,“德国”

2,“朝鲜”

表:WhenDead



[id [pk],actionToTake(char)]

1,“忽略/不可能取件”

2,“创建/模仿亲属并领取保险”

在正常情况下,如果需要这些表中的某些信息,则只需使用普通SQL对两个外键进行联接。 (fx说明,而不仅仅是ID)。
每个人只能连接到一个国家和一个WhenDead表,但是,为了避免重复,多个人当然应该能够引用相同的外键值。

我试图在Hibernate中使用@OneToOne批注,并将这两个表的列名用作Entity上的外键ID。它起作用了,但是似乎与OneToOne的含义背道而驰……“一个表中的每一行在另一个表中都有对应的行”和“行数必须在两个表中都匹配”。

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

有人可以将我推向正确的方向吗?还是我应该继续讲OneToOne,每个印度冬眠教程都说“除非您有很大的设计缺陷,否则从不使用”

最佳答案

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

让我们举个例子:


从A到B的OneToOne:A具有0或一个B,并且B不能与多个As关联。因此,两个表中的行数不必相同。示例:一辆汽车有一个单板号(如果尚未售出,则为0)。 OneToOne确实非常罕见,我很难找到一个例子。
OneToMany:一个A具有0、1或几个B。示例:一家公司有很多员工。
ManyToOne:A具有0或一个B,并且B可以与多个As关联。例如:一个人有一个父亲(一个父亲可能有几个孩子)。
ManyToMany:A具有0、1或几个B,并且B可以与0,一个或多个As关联。典型示例:一个学生有很多课程,然后是几名学生。


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


人-多对一-国家
人-多对一-死亡时


确实,有几个人住在同一个国家,但一个人住在0或1个国家。有几个人可能希望被火化(不确定英语是否正确),但是一个人既不能被火化又不能被埋葬。

当然,您可以选择使这些关联成为双向的,或者甚至仅在另一个方向上实现它们。在这种情况下,


国家-一对多-人
WhenDead-一对多-人


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

10-04 11:02