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

Hibernate 繼承映射完全指南(二):每具體類一表映射配置詳解

     編輯:Java 相關知識

承接系列首篇,本文詳細講解每具體類一表 策略的映射文件編寫規則,包括字段重複定義、關聯映射重複、以及初始化註冊細節。

表結構對應

  • COMPANIES — 公司表
  • HOURLY_EMPLOYEES (HE) — 時薪員工表
  • SALARIED_EMPLOYEES (SE) — 月薪員工表

子表包含父類所有字段 (ID, NAME) + 自身字段 (RATE/SALARY) + 關聯外鍵 (COMPANY_ID)。

映射文件:三個獨立 .hbm.xml

1. HourlyEmployee.hbm.xml

<hibernate-mapping>
  <class name="mypack.HourlyEmployee" table="HOURLY_EMPLOYEES">
    <id name="id" column="ID"><generator class="increment"/></id>
    <property name="name" column="NAME"/> <!-- 繼承字段重複定義 -->
    <property name="rate" column="RATE" type="double"/> <!-- 自身字段 -->
    <many-to-one name="company" column="COMPANY_ID" class="mypack.Company"/> <!-- 關聯重複定義 -->
  </class>
</hibernate-mapping>

2. SalariedEmployee.hbm.xml

<hibernate-mapping>
  <class name="mypack.SalariedEmployee" table="SALARIED_EMPLOYEES">
    <id name="id" column="ID"><generator class="increment"/></id>
    <property name="name" column="NAME"/>
    <property name="salary" column="SALARY" type="double"/>
    <many-to-one name="company" column="COMPANY_ID" class="mypack.Company"/>
  </class>
</hibernate-mapping>

3. Company.hbm.xml (無變化)

<hibernate-mapping>
  <class name="mypack.Company" table="COMPANIES">
    <id name="id" column="ID"><generator class="increment"/></id>
    <property name="name" column="NAME"/>
    <set name="employees" inverse="true" lazy="true">
      <key column="COMPANY_ID"/>
      <one-to-many class="mypack.Employee"/> <!-- 注意:這裡引用父類/介面 -->
    </set>
  </class>
</hibernate-mapping>

關鍵觀察點

  1. 字段重複:name、id、company 關聯在每個子類映射中完整重複定義。
  2. 無父類映射:Employee (抽象類) 沒有 .hbm.xml,不參與持久化。
  3. Company 端引用父類:<one-to-many class="mypack.Employee"/> 引用抽象父類,但實際運行時集合為空(不支援多態關聯)。
  4. 初始化註冊:config.addClass(HourlyEmployee.class).addClass(SalariedEmployee.class),無需註冊 Employee。

對應關係圖

持久化類、映射文件、數據庫表對應圖

圖示:Company 1:N HourlyEmployee/SalariedEmployee,但無共享父表。

避坑指南

  • 主鍵生成衝突:各表獨立 increment 生成器會產生重複 ID。生產環境必須使用共享序列、uuid.hex 或資料庫原生 identity/sequence 保證跨表唯一。
  • Schema 變更同步:給 Employee 加字段 → 需同步修改 所有子類映射文件 及 所有子表結構。
  • 查詢多態性:HQL from Employee 會拋異常 (抽象類) 或只查 Employee 表 (具體類),永遠無法自動查詢子表。

此策略將「繼承」純粹視為代碼復用,數據層完全扁平化。理解其映射冗餘與多態缺失,是為掌握進階策略鋪路。

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