首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate 進階(六):一對一雙向關聯映射全解析

     編輯:Java 相關知識

一對一雙向關聯核心區別

與單向關聯不同,雙向關聯中雙方均持有對方引用:
• Person 持有 IdCard 引用
• IdCard 也持有 Person 引用
這意味著:加載 Person 可導航到 IdCard,加載 IdCard 同樣可導航到 Person。

實體類結構

雙向關聯類圖

public class Person {
    private int id;
    private String name;
    private IdCard idCard; // 關聯引用
    // getter/setter 省略
}

public class IdCard {
    private int id;
    private String cardNo;
    private Person person; // 反向引用
    // getter/setter 省略
}

映射策略與表結構

雙向關聯同樣分為主鍵關聯和唯一外鍵關聯,生成的表結構與單向一致,差異僅在導航方向。

1. 主鍵關聯(共享主鍵)

主鍵關聯表結構

特點:兩表主鍵值相同,Person 表主鍵同時是外鍵指向 IdCard。

<class name="com.zs.hibernate.IdCard" table="t_idCard">
    <id name="id">
        <generator class="native"/>
    </id>
    <property name="cardNo"/>
    <one-to-one name="person"/> <!-- 關聯 Person -->
</class>

<class name="com.zs.hibernate.Person" table="t_person">
    <id name="id">
        <generator class="foreign"> <!-- 外鍵生成器 -->
            <param name="property">idCard</param>
        </generator>
    </id>
    <property name="name"/>
    <one-to-one name="idCard" constrained="true"/> <!-- constrained=true 表示外鍵約束 -->
</class>

2. 唯一外鍵關聯

唯一外鍵關聯表結構

特點:Person 表額外有一個唯一外鍵列指向 IdCard 主鍵。

<class name="com.zs.hibernate.IdCard" table="t_idCard">
    <id name="id">
        <generator class="native"/>
    </id>
    <property name="cardNo"/>
    <one-to-one name="person" property-ref="idCard"/>
</class>

<class name="com.zs.hibernate.Person" table="t_person">
    <id name="id">
        <generator class="native"/>
    </id>
    <property name="name"/>
    <many-to-one name="idCard" unique="true"/> <!-- many-to-one + unique=true 模擬一對一 -->
</class>

註解配置替代 XML

同樣可用 JPA 註解(@OneToOne、@JoinColumn、@MapsId 等)替代 XML,推薦現代項目使用註解,類與映射統一維護。

關鍵要點總結

  • 雙向關聯 = 單向關聯 + 反向引用
  • 表結構不變,僅增加導航路徑
  • 主鍵關聯用 foreign 生成器 + constrained="true"
  • 外鍵關聯用 many-to-one unique="true" + property-ref
  • 實際開發中,單向關聯往往足夠,僅在確實需要反向導航時用雙向

至此,一對一單向/雙向關聯映射講解完畢。下一章將進入一對多、多對一關聯映射。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved