領域模型中的繼承關系(如 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、保存多表操作、配置相對複雜 |
from Employee 返回 HourlyEmployee 和 SalariedEmployee 實例混合集合。Company.employees 集合同時持有兩類實例引用。EMPLOYEE_TYPE = 'HE'/'SE')。複雜繼承樹可拆分為多棵子樹,各採最適策略。例如:淺層高頻分支用單表,深層核心領域用 Joined。
super(...) 初始化父字段,便於業務代碼 new 對象 (Hibernate 只用無參建構子)。掌握三大策略的本質取捨,是成為 Hibernate 專家、進行高效數據庫_schema_設計的基石。