與單向關聯不同,雙向關聯中雙方均持有對方引用:
• 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 省略
}
雙向關聯同樣分為主鍵關聯和唯一外鍵關聯,生成的表結構與單向一致,差異僅在導航方向。

特點:兩表主鍵值相同,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>

特點: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>
同樣可用 JPA 註解(@OneToOne、@JoinColumn、@MapsId 等)替代 XML,推薦現代項目使用註解,類與映射統一維護。
foreign 生成器 + constrained="true"many-to-one unique="true" + property-ref至此,一對一單向/雙向關聯映射講解完畢。下一章將進入一對多、多對一關聯映射。