承接上篇(每具體類一表),本文詳細講解單表策略 的核心映射元素:<discriminator> 判別欄與 <subclass> 子類映射,並展示完整映射文件與表數據示例。
EMPLOYEES 表包含:
ID(PK), NAME, COMPANY_ID(FK)RATE (Hourly), SALARY (Salaried)EMPLOYEE_TYPE (VARCHAR) — 值 'HE' 或 'SE'Employee.hbm.xml<hibernate-mapping>
<class name="mypack.Employee" table="EMPLOYEES">
<id name="id" column="ID"><generator class="increment"/></id>
<!-- 判別欄:核心配置 -->
<discriminator column="EMPLOYEE_TYPE" type="string"/>
<property name="name" column="NAME"/>
<many-to-one name="company" column="COMPANY_ID" class="mypack.Company"/>
<!-- 子類映射為 subclass 元素,嵌套在父類內 -->
<subclass name="mypack.HourlyEmployee" discriminator-value="HE">
<property name="rate" column="RATE" type="double"/>
</subclass>
<subclass name="mypack.SalariedEmployee" discriminator-value="SE">
<property name="salary" column="SALARY" type="double"/>
</subclass>
</class>
</hibernate-mapping>
| 元素/屬性 | 作用 | 備註 |
|---|---|---|
<discriminator> | 聲明判別欄名稱與類型 | 必須放在 <id> 之後、屬性之前 |
column | 資料庫欄位名 | 如 EMPLOYEE_TYPE |
type | 欄位 Java 類型 | string, integer, character 等 |
<subclass> | 映射子類,不創建新表 | 繼承父類主鍵,無需 <id> |
discriminator-value | 該子類對應的判別值 | 如 'HE', 'SE',區分大小寫 |

數據行示例:
ID | NAME | RATE | SALARY | EMPLOYEE_TYPE | COMPANY_ID
1 | John | 100.0 | NULL | HE | 1
2 | Jane | NULL | 5000.0 | SE | 1
僅需註冊父類:config.addClass(Employee.class)。Hibernate 自動處理子類實例化邏輯。
<subclass> vs <joined-subclass><subclass> → 單表策略,無 <key>,共享父表主鍵。<joined-subclass> → 連接策略,需 <key> 聲明子表 PK/FK 列。discriminator-value 在體系內必須唯一。RATE) 在資料庫層面無法加 NOT NULL,需靠應用層驗證。單表策略配置簡潔,是「快速原型、高頻多態讀取」場景的首選,但生產環境需權衡數據完整性妥協。