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

Hibernate 基礎映射:一對一外鍵關聯單向映射速成

     編輯:Java 相關知識

一對一外鍵關聯是「多對一」的特例——只需在多對一映射基礎上加入 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 端建立導航,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>

對照:多對一 vs 一對一外鍵

特性多對一一對一外鍵
映射標籤 <many-to-one> <many-to-one unique="true">
資料庫約束 普通外鍵 唯一外鍵 (UNIQUE)
物件語義 多個 Person 可共用一 IdCard 每個 Person 專屬一 IdCard
反向導航 通常有 單向映射無

JPA 註解寫法

@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
}

適用場景判斷

  • ✅ 僅需從 Person 查詢 IdCard,無反向查詢需求
  • ✅ IdCard 為獨立實體,有自身生命週期(如:身分證可預製、註銷、重發)
  • ❌ 需雙向導航 → 改用 雙向映射
  • ❌ IdCard 無獨立意義,隨 Person 生死 → 改用主鍵共享一對一 或 組件映射

單向一對一外鍵映射是「最小可行性配置」,理解其本質為「受約束的多對一」,有助於在複雜模型中快速決策映射策略。

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