我正在学习JPA关系(@ OneToOne,@ ManyToOne,...),当我与人们谈论他们如何为他们的实体建模时,我得到的就越混乱。这是昨天的一个例子:
假设我们在Person
和Address
之间存在关系。 DB将Address.id
作为FK存储在Person
表中作为“address_id”。这种关系是OneToOne还是OneToMany?我听说过人们为每个人争论,两者都有充分的理由说明他们为什么会这样。
一个人认为它“是一个ManyToOne,因为address_id对于每个记录都不是唯一的。同样的address_id可以在Person
表中反复使用。他认为真正有一个OneToOne ,Person
表中的FK必须是JSR规范中指示的唯一“。
另一个人说“当你考虑Person
记录时,他们会有多个Address
吗?如果没有,那么它就是OneToOne;为什么会使问题复杂化”
我很困惑哪个是真的。一方面,第一个人能够提出JSR规范并通过它与我交谈。另一方面,我有一位拥有超过20年经验(并且备受尊重)的开发人员,告诉我要保持简单。
有人可以帮我解释一下
谢谢!
答案 0 :(得分:1)
我将从人到地址进行关联。
指定人员不能拥有多个地址,因为其关联的表格中包含该地址的外键列。
因此,它可以是OneToOne或ManyToOne。
由您来决定它是哪一个,而且选择并不依赖于任何技术。如果你不想让两个不同的人分享同一个地址,那么它就是OneToOne。如果您认为两个人可以共享同一个地址,那么它就是ManyToOne。
如果它是OneToOne,你应该确保它确实是OneToOne,并且两个人不能共享同一个地址。最有效和最简单的方法是添加person表的address_id列的唯一约束。但是如果你设置了这个约束,Hibernate并不在乎。
您的"其他个人"是错的。如果两个人可以共享相同的地址,那么它应该是ManyToOne。不是OneToOne。想象一下,你使它成为一个双向关联:由于一个地址可以由多个人共享,你将在Address和Person之间建立一个OneToMany关联,这将是Person和Address之间关联的反转。 OneToMany的反向关联必须是ManyToOne,而不是OneToOne。
答案 1 :(得分:0)
我们有人和地址。我们需要确定它们之间的关系。 你可以用两种不同的方式看到这种关系,如下所示
1.从人到地址
从表中获取一个地址实例或行,并问自己这个特定的地址行是否与多人有关系。 如果是,如果没有人员方面,则人员方面很多。 因此,在此阶段,您已确定人是多人还是一人
现在从你的桌子上拿起一个人或一排,并问自己这个人可以有多个地址。如果是,则关系的地址侧是许多其他地址侧是一个。
你的例子
Person有一个引用地址id
的外键基于此信息让我们进行头脑风暴
一个人可以拥有多个相关地址??? person表中的每个人都有一个引用Address行的外键(address_id)。鉴于address_id不是多值的,我们可以说一个Person只能有一个与之相关的地址。 所以关系的地址方面是ONE
一个地址可以属于多个人吗?
我们知道人有address_id是地址的外键。并且没有约束指定address_id是唯一的。那就是address_id列对于Person表上的多行可以有相同的值。我们可以说多人可以有相同的地址。 所以人际关系的方面很多
最后我们得出结论 人与地之间的关系是多种多样的
注意: - 如果人员表中的外键address_id具有应用于其的唯一约束,则在该情况下多人将不能引用相同的地址,因此使关系的人员侧为ONE。因此,这种关系将成为一对一
答案 2 :(得分:0)
某些数据库没有直接选项来设置一对一关系。您可以使用@JB Nizet中的唯一约束或使用Person.id作为Adress表的主键以及Person表的外键来强制它。
如果您不这样做,您将无法确定关系是1:1还是1:n,而不知道您正在使用的数据值。