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

Hibernate 繼承映射完全指南(一):三大策略核心對比與選型思想

     編輯:Java 相關知識

領域模型中的繼承關系(如 Employee → HourlyEmployee/SalariedEmployee)如何映射到關係數據庫?Hibernate 提供三種標準策略,各有取捨。本文建立整體認知框架,為後續深入各策略鋪路。

領域模型示例

  • Company 1:N Employee (抽象父類)
  • Employee 有兩個具體子類:HourlyEmployee (時薪 rate)、SalariedEmployee (月薪 salary)
  • 關鍵特徵:多態查詢 (from Employee 返回所有子類)、多態關聯 (Company.employees 包含兩類實例)

三大映射策略核心對比

策略名稱表結構多態查詢/關聯核心優勢核心劣勢
1. 每具體類一表
(Table per Concrete Class)
各子類獨立表,含繼承字段 ❌ 完全不支援 簡單、無 Join、子類完全隔離 無多態、字段冗余、主鍵難統一、Schema 維護困難
2. 單表策略
(Table per Class Hierarchy)
單表含所有字段 + 判別欄 ✅ 原生支援,效能最優 查詢最快(無 Join)、映射簡單、保存單 INSERT 違反 3NF、稀疏表、子類非空約束失效、表膨脹
3. 連接策略
(Table per Subclass / Joined)
父表 + 子表 (PK=FK) ✅ 原生支援 符合範式、數據完整、非空約束可用、結構清晰 多態查詢需 Join、保存多表操作、配置相對複雜

關鍵概念釐清

  • 具體類 = 非抽象類,可實例化 (HourlyEmployee, SalariedEmployee)。
  • 多態查詢:HQL from Employee 返回 HourlyEmployee 和 SalariedEmployee 實例混合集合。
  • 多態關聯:Company.employees 集合同時持有兩類實例引用。
  • 判別欄:單表策略中區分子類型的欄位 (如 EMPLOYEE_TYPE = 'HE'/'SE')。

選型決策樹

  1. 需多態查詢/關聯?
    • 否 → 考慮策略 1 (極少見)
    • 是 → 進入 2
  2. 嚴格要求數據完整性/範式?
    • 是 → 選 策略 3 (Joined Subclass)
    • 否 → 進入 3
  3. 極高頻多態讀取、子類字段少、可容忍 NULL?
    • 是 → 選 策略 2 (單表)
    • 否 → 選 策略 3 (Joined Subclass) (最通用穩健)

進階:混合策略

複雜繼承樹可拆分為多棵子樹,各採最適策略。例如:淺層高頻分支用單表,深層核心領域用 Joined。

實體類設計通用原則

  • 提供全參建構子調用 super(...) 初始化父字段,便於業務代碼 new 對象 (Hibernate 只用無參建構子)。
  • 盡量淺化繼承樹,避免「為了映射而設計繼承」。
  • 不同策略只改映射文件與表結構,領域模型類代碼完全不變 —— 這是 Hibernate 映射透明性的核心價值。

掌握三大策略的本質取捨,是成為 Hibernate 專家、進行高效數據庫_schema_設計的基石。

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