0

我的数据库技能有点生疏,所以学习 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, '秘密地址', true, 1, 2

表:国家

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


1、“德国”

2、“朝鲜”

表:何时死亡


[ id[pk],actionToTake(char) ]

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

2、‘火葬/模仿亲人,代收保险’

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

我尝试在 Hibernate 中使用 @OneToOne 注释,将这两个表的列名作为实体上的外键 id。它有效,但是,它似乎与 OneToOne 所代表的背道而驰……“表中的每一行在另一个表中都有相应的行”和“行数必须在两个表中匹配”。

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

有人能把我推向正确的方向吗,还是我应该继续使用 OneToOne,每个印度休眠教程都说“除非你有很大的设计缺陷,否则永远不会使用”

4

1 回答 1

1

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

让我们举个例子:

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

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

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

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

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

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

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

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

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

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

于 2013-10-05T17:14:03.627 回答