抽象基類不映射表,每個具體子類映射獨立表,表包含繼承自基類的所有欄位。 適合多態查詢較少、子類差異大、報表查詢頻繁的場景。
package javamxj.inheritance.three;
public abstract class Person {
private Long id;
private String name;
/** @hibernate.id column="ID" generator-class="hilo" unsaved-value="null" */
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
/** @hibernate.property length="24" */
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
關鍵:無 @hibernate.class 標記,不生成映射檔、不建表。
package javamxj.inheritance.three;
/** @hibernate.class table="Student" */
public class Student extends Person {
private String studentNumber;
/** @hibernate.property length="24" */
public String getStudentNumber() { return studentNumber; }
public void setStudentNumber(String studentNumber) { this.studentNumber = studentNumber; }
}
package javamxj.inheritance.three;
/** @hibernate.class table="Professor" */
public class Professor extends Person {
private int salary;
/** @hibernate.property */
public int getSalary() { return salary; }
public void setSalary(int salary) { this.salary = salary; }
}
← 繼承欄位內聯
← 繼承欄位內聯
CREATE TABLE Student (
ID BIGINT NOT NULL,
studentNumber VARCHAR(24),
name VARCHAR(24),
PRIMARY KEY (ID)
);
CREATE TABLE Professor (
ID BIGINT NOT NULL,
salary INTEGER,
name VARCHAR(24),
PRIMARY KEY (ID)
);
無 Person 表,子表自包含所有欄位。
List list = session.find("from Person"); // HQL 查詢基類
for (Iterator it = list.iterator(); it.hasNext();) {
Person p = (Person) it.next();
System.out.println(p.getName() + " -> " + p.getClass().getName());
}
關鍵限制:Hibernate 以 **UNION** 方式查詢所有子表,無法保證 ID 唯一性跨表 (需業務層保證或共用 hilo 生成器)。多態關聯 (如 many-to-one 指向 Person) **不支援**。
| 優點 | 缺點 |
|---|---|
|
|
| 策略 | 表數量 | 多態支援 | 空間效率 | 修改基類影響 | 報表友好度 |
|---|---|---|---|---|---|
| 單表 (Table per Hierarchy) | 1 | 最好 | 低 (大量 NULL) | 小 (加欄位) | 好 |
| 每子類一表 (Joined Subclass) | 1+N | 好 | 高 (正規化) | 中 (需遷移) | 需 View |
| 每具體類一表 | N | 差 (Union) | 中 (冗餘) | 大 (全子表改) | 最好 |
「每個具體類一張表」以**空間換查詢簡單**,犧牲多態與維護靈活性。選型時以**業務存取模式**為準:報表多、多態少 → 選此;多態核心、結構常變 → 選 Joined Subclass;簡單層次、效能優先 → 選單表。下一篇將介紹**組件 (Component) 映射**。