一對一外鍵關聯是「多對一」的特例——只需在多對一映射基礎上加入 unique="true" 約束。本文以最精簡代碼示範單向導航配置。
資料庫結構:
CREATE TABLE t_person (
id INT PRIMARY KEY,
name VARCHAR(50),
id_card_id INT UNIQUE, -- 唯一外鍵
FOREIGN KEY (id_card_id) REFERENCES t_idcard(id)
);
CREATE TABLE t_idcard (
id INT PRIMARY KEY,
card_no VARCHAR(20)
);
僅在 Person 端建立導航,IdCard 完全不知曉 Person 存在。
<class name="Person" table="t_person">
<id name="id"><generator class="native"/></id>
<property name="name"/>
<!-- 關鍵:unique="true" 將多對一轉為一對一 -->
<many-to-one name="idCard"
class="IdCard"
column="id_card_id"
unique="true"
cascade="save-update"/>
</class>
| 特性 | 多對一 | 一對一外鍵 |
|---|---|---|
| 映射標籤 | <many-to-one> | <many-to-one unique="true"> |
| 資料庫約束 | 普通外鍵 | 唯一外鍵 (UNIQUE) |
| 物件語義 | 多個 Person 可共用一 IdCard | 每個 Person 專屬一 IdCard |
| 反向導航 | 通常有 | 單向映射無 |
@Entity
@Table(name = "t_person")
public class Person {
@Id @GeneratedValue
private int id;
private String name;
@OneToOne
@JoinColumn(name = "id_card_id", unique = true)
private IdCard idCard;
// getter/setter
}
單向一對一外鍵映射是「最小可行性配置」,理解其本質為「受約束的多對一」,有助於在複雜模型中快速決策映射策略。