gpt4 book ai didi

java - Hibernate、OneToOne 单外键引用

转载 作者:行者123 更新时间:2023-12-01 14:02:56 25 4
gpt4 key购买 nike

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

我一直在阅读一对一、一对多和多对多的知识,简而言之,这是我从小就理解的:

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

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

多对多:- 许多医生可以拥有/共享不同的患者。 (没有双关语的意思)。

假设我有下表,适用于承办人客户模型

餐 table 人员:

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

1, '马丁·詹森', 91, '不幸街 4', false, 2, 1

2, ' killer 克劳斯', 67, '顽固街 9', true, 1, 2

2, '宾果人', 46, ' secret 地址', true, 1, 2

表:国家

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

<小时/>

1、“德国”

2、“朝鲜”

表格:WhenDead

<小时/>

[ id[pk], actionToTake(char) ]

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

2、‘火葬/仿亲并领取保险’

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

我尝试在 Hibernate 中使用 @OneToOne 注释,将这两个表的列名作为实体上的外键 id。然而,它的工作原理似乎违背了 OneToOne 的含义......“表中的每一行在另一个表中都有对应的行”和“行数必须在两个表中匹配”。

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

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

最佳答案

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

让我们举个例子:

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

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

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

  • ManyToMany:A有0个、1个或多个B,B可以关联0个、1个或多个A。典型例子:一个学生有很多门类(class),一门类(class)有几个学生学习。

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

  • 人员 - ManyToOne - 国家/地区
  • 人 - ManyToOne - WhenDead

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

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

  • 国家/地区 - 一对多 - 人员
  • WhenDead - OneToMany - 人

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

关于java - Hibernate、OneToOne 单外键引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19200248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com