当前位置: 首页 > 知识库问答 >
问题:

Hibernate,OneToOne单外键引用

戈博易
2023-03-14

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

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

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

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

多对多:-许多医生可以拥有/分享不同的病人。(无意双关语)。

假设我有以下表格,对于殡仪员客户模型

[id[pk]、全名(char)、年龄(int)、地址(char)、发送花(boolean)、国家(fk)、何时(fk)]

1号,马丁·詹森,91号,诺幸运街4号,假,2号,1号

2.《杀手克劳斯》67.《死硬街9号》,对,1,2

2,“宾果人”,46,“秘密地址”,真实,1,2

表格:国家

[id[pk],名称(char)]

1.“德国”

2.“朝鲜”

表:Whended

[id[pk],actionToTake(字符)]

1.“忽略/不可能拾取”

2.“火化/模仿亲属并收取保险”

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

我试图在HiberNate中使用@OneToOne注释,将这两个表的列名作为实体上的外键id。它起作用了,但是,它似乎违背了OneToOne的含义...“一个表中的每一行在另一个表中都有相应的行”和“行数,必须在两个表中匹配”。

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

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

共有1个答案

宣瀚
2023-03-14

你搞错了,你忘记了一种联系:很多。

让我们以你为例:

>

一个A有0、1或几个B。例如:一个公司有很多员工。

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

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

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

  • 个人-多个国家/地区
  • 人-许多人-何时

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

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

  • 国家-一家公司-个人
  • 当一个人的时候

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

 类似资料:
  • 我有两张桌子: 基本上,我想通过id字段定义一个从到的外键,这两个表中的字段是相同的。问题是,当我在IntelliJ Idea中检查数据库时,我在Keys部分没有看到任何外键(检查了两个表),只有它们的PK。这段代码有问题吗?我已经按照另一个类似问题中的建议设置了属性:

  • 我有一个这样的实体: 多谢了,安德里亚

  • 我可以这样做吗?或者有没有其他更好的方法来处理这种情况

  • 问题内容: 它是有效申报,并在关系的双方,如: 我找不到任何表明这是无效的信息,但似乎在持久性过程中,至少必须违反关系的一侧。(例如,如果首先写入changeEntry,则changeEntryDetails临时为null)。 尝试此操作时,我看到抛出了异常。 我想避免在可能的情况下放宽约束,因为双方都 必须 存在。 问题答案: 声明并在关系的两边是否合法(…)我找不到任何表明无效的内容,但是在持

  • 我有一个@OneToOne关系映射。我可以获取记录并查看关系,但我无法创建记录并保留外键。目前,当在父表(FacilityGeneral)中创建新记录时,我也会在子表(FacilityLocation)中创建新记录,但是,子表中的外键不会自动创建。 我试图通过编程将创建为父表(FacilityGeneral)中主键的序列值分配给子表中的不同字段来持久化它,但由于序列#在对象持久化之前不会生成,因此

  • 问题内容: 我看不到“多对一”关系与“一对一”关系的架构有什么区别: 与 有什么区别吗? 问题答案: 它们在架构上看起来完全相同,但是在Hibernate Layer上有所不同。 如果尝试这样的操作: 一切都会好起来的。但是,保存后,如果您尝试获取订单: 当然,在两种情况下,您的Address类应该看起来有所不同。