如何在外键上进行双向一对一关联[重复]

Posted

技术标签:

【中文标题】如何在外键上进行双向一对一关联[重复]【英文标题】:How bidirectional one-to-one association on a foreign key [duplicate] 【发布时间】:2015-09-08 12:55:52 【问题描述】:

阅读一些休眠文档,我偶然发现了这种模式:

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <many-to-one name="address" 
        column="addressId" 
        unique="true"
        not-null="true"/>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
    <one-to-one name="person" 
        property-ref="address"/>
</class>

from jboss hibernate doc

乍一看,这似乎很简单。每个人只有一个地址,每个地址都有一个人。

但是在数据库中,这种模式将允许一个地址有多个人引用它,休眠如何在没有列表的情况下解决这个映射? 一对一如何在多对一字段上拥有属性引用?我认为应该只能有多对一一对多或一对一一对一。

编辑:虽然看起来可能(如果在语义上不正确)进行一对一 一对多映射,但我的问题是关于 ma​​ny-to -one 一对一

我知道这个网站上已经有一些关于一对一与多对一的答案,但我没有在这些帖子中找到我的问题的答案。

感谢您的宝贵时间。

【问题讨论】:

这篇文章没有回答我的问题,因为我确实关心映射的两边。 只是一个问题,哪个表有外键列。在这种情况下,它是一个 Person,它的多对一关系可以表示为一对一。 好的,但这不是我的问题。我问,考虑到多个人可以拥有相同的地址,在地址中使用一对一是错误的吗?为什么它应该工作/不工作? 【参考方案1】:

如果你在数据库中有唯一约束,那么两个人不可能有相同的地址。

但是,如果缺少约束并且确实有多个人具有相同的地址,则此映射不正确,并且在访问 Address 中的 person 关联时可能会出现异常或错误/不可预测的结果实体。

【讨论】:

好的,所以在这个例子中,多对一实际上是伪装的一对一,并且多对一一对一映射是不正确的唯一约束。 是的。但是如果你从不将同一个地址与两个人联系起来,那可能是正确的; Hibernate 不会自行对其执行任何检查,这是数据库的工作。有了约束,您只需做出更好的一致性保证,并明确说明这是一对一的关联。

以上是关于如何在外键上进行双向一对一关联[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate学习———— hibernate一对一关系映射详解

Hibernate,关系映射的多对一单向关联多对一双向关联一对一主键关联一对一外键关联多对多关系关联

Hibernate一对一外键双向关联(Annotation配置)

hibernate学习四 hibernate关联关系映射

hibernate------映射相关

hibernate 一对多双向关联 外键值为空 怎么结决?