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 Table1类结构简单、性能要求高
Joined正常业务中推荐,结构清晰
Table Per Class查询子类为主、不查父类