JPA以及如何思考人际关系

时间:2016-06-28 11:42:26

标签: java hibernate jpa orm

我正在学习JPA关系(@ OneToOne,@ ManyToOne,...),当我与人们谈论他们如何为他们的实体建模时,我得到的就越混乱。这是昨天的一个例子:

假设我们在PersonAddress之间存在关系。 DB将Address.id作为FK存储在Person表中作为“address_id”。这种关系是OneToOne还是OneToMany?我听说过人们为每个人争论,两者都有充分的理由说明他们为什么会这样。

一个人认为它“是一个ManyToOne,因为address_id对于每个记录都不是唯一的。同样的address_id可以在Person表中反复使用。他认为真正有一个OneToOne ,Person表中的FK必须是JSR规范中指示的唯一“。

另一个人说“当你考虑Person记录时,他们会有多个Address吗?如果没有,那么它就是OneToOne;为什么会使问题复杂化”

我很困惑哪个是真的。一方面,第一个人能够提出JSR规范并通过它与我交谈。另一方面,我有一位拥有超过20年经验(并且备受尊重)的开发人员,告诉我要保持简单。

有人可以帮我解释一下

谢谢!

3 个答案:

答案 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. 从人到地址
  2. 从地址到人
  3.   

    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,而不知道您正在使用的数据值。