在 Hibernate 中,继承映射策略用于将 Java 类的继承结构映射到数据库表中。Hibernate 提供了三种主要的继承映射策略:
1. Single Table(单表策略)
特点:
- 所有类的数据都存储在一个表中。
- 用一个区分字段(discriminator column)来标识是哪一个子类。
- 性能最好,因为只涉及一个表,不需要连接查询。
表结构示例:
CREATE TABLE person (
id INT PRIMARY KEY,
name VARCHAR(100),
salary DOUBLE,
grade VARCHAR(10),
person_type VARCHAR(31) -- 区分字段
);
注解用法:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "person_type")
public class Person { ... }
@Entity
@DiscriminatorValue("EMP")
public class Employee extends Person { ... }
@Entity
@DiscriminatorValue("STU")
public class Student extends Person { ... }
2. Joined(表连接策略)
特点:
- 父类和子类各自拥有独立的表,通过外键关联。
- 数据冗余低,结构清晰。
- 查询时需要连接表,性能略差。
表结构示例:
CREATE TABLE person (
id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE employee (
id INT PRIMARY KEY,
salary DOUBLE,
FOREIGN KEY (id) REFERENCES person(id)
);
注解用法:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person { ... }
@Entity
public class Employee extends Person { ... }
3. Table Per Class(每类一表策略)
特点:
- 每个类(包括父类和子类)对应一个独立的表。
- 查询父类时会用
UNION
联合所有子类表。 - 数据冗余较高,不支持外键约束。
表结构示例:
CREATE TABLE employee (
id INT PRIMARY KEY,
name VARCHAR(100),
salary DOUBLE
);
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(100),
grade VARCHAR(10)
);
注解用法:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Person { ... }
@Entity
public class Employee extends Person { ... }
总结建议:
策略 | 表数量 | 查询性能 | 数据冗余 | 建议使用场景 |
---|---|---|---|---|
Single Table | 1 | 高 | 高 | 类结构简单、性能要求高 |
Joined | 多 | 中 | 低 | 正常业务中推荐,结构清晰 |
Table Per Class | 多 | 低 | 高 | 查询子类为主、不查父类 |