關系映射處理多個對象與表之間的關聯,共七類:
一對一單向、一對一雙向、一對多單向、多對一單向、一對多雙向、多對多單向、多對多雙向。
本章專講一對一單向關聯。
• Person 持有 IdCard 引用
• IdCard 不持有 Person 引用
• 只能從 Person 導航到 IdCard,反向不可行

public class Person {
private int id;
private String name;
private IdCard idCard; // 單向引用
// getter/setter
}
public class IdCard {
private int id;
private String cardNo;
// 無 Person 引用
// getter/setter
}

Person 表主鍵同時是指向 IdCard 的外鍵,值相同。
<class name="com.zs.hibernate.IdCard" table="t_idCard">
<id name="id"><generator class="native"/></id>
<property name="cardNo"/>
</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"/>
</class>

Person 表額外加一個唯一外鍵列 idCard_id 指向 IdCard 主鍵。
<class name="com.zs.hibernate.IdCard" table="t_idCard">
<id name="id"><generator class="native"/></id>
<property name="cardNo"/>
</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"/>
</class>
同基本映射,可用 @OneToOne + @JoinColumn(unique=true) 或 @MapsId 實現,建議查閱官方文檔或專書深入學習註解細節。
| 維度 | 主鍵關聯 | 唯一外鍵關聯 |
|---|---|---|
| 表結構 | 共享主鍵,Person 無額外 FK 列 | Person 有唯一 FK 列 |
| 生成器 | Person 用 foreign 生成器 | 雙方用 native 獨立生成 |
| 約束 | constrained="true" 強制外鍵 | unique="true" 保證一對一 |
| 適用場景 | 強綁定、生命周期一致 | 較鬆散、可選關聯 |
下一章將講解一對一雙向關聯映射,敬請期待。