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

Hibernate 繼承映射完全指南(四):單表策略配置詳解與判別欄機制

     編輯:Java 相關知識

承接上篇(每具體類一表),本文詳細講解單表策略 的核心映射元素:<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',區分大小寫

表數據示例

EMPLOYEES 表數據

數據行示例:

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 列。

避坑提醒

  1. 判別值唯一:每個子類的 discriminator-value 在體系內必須唯一。
  2. 非空約束失效:子類必填字段 (如 RATE) 在資料庫層面無法加 NOT NULL,需靠應用層驗證。
  3. 字段衝突:不同子類不可定義同名非繼承字段,否則映射衝突。

單表策略配置簡潔,是「快速原型、高頻多態讀取」場景的首選,但生產環境需權衡數據完整性妥協。

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