JPA单表继承策略详解与实例
在Java Persistence API(JPA)中,单表继承策略是一种常用的继承映射方式,它将一个继承体系中的所有类映射到一个单一的数据库表中。本文将详细解析单表继承策略的实现原理,并结合实例进行说明。
单表继承策略概述
单表继承策略通过在单个数据库表中存储所有继承层次结构的类,使用一个区分列(Discriminator Column)来区分不同子类的记录。这种策略的优点是简单且易于实现,但缺点是某些列对于某些子类可能不适用,导致表中出现空值。
实现步骤
- 使用
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
注解在根实体类上声明继承策略。 - 使用
@DiscriminatorColumn
注解指定区分列的属性。 - 使用
@DiscriminatorValue
注解在每个具体子类上指定一个唯一的区分值。 - 对于根类和子类,使用
@Entity
和其他元数据注解。
示例代码
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "EMP_TYPE")
public abstract class Employee {
@Id
private long id;
private String name;
// 其他属性和方法
}
@Entity
@DiscriminatorValue("F")
public class FullTimeEmployee extends Employee {
private int salary;
// 其他属性和方法
}
@Entity
@DiscriminatorValue("P")
public class PartTimeEmployee extends Employee {
private int hourlyRate;
// 其他属性和方法
}
持久化和加载数据
以下是如何使用EntityManager进行数据的持久化和加载的示例:
public class ExampleMain2 {
public static void main(String[] args) throws Exception {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("example-unit");
try {
persistEntities(emf);
runNativeQueries(emf);
loadEntities(emf);
} finally {
emf.close();
}
}
// 省略具体实现方法
}
示例项目技术栈
- H2 Database Engine 1.4.196
- Hibernate Core 5.2.10.Final
- JDK 1.8
- Maven 3.3.9
结论
单表继承策略在JPA中是一种高效且常用的继承映射方式,尤其适用于继承层次结构不是特别复杂的情况。通过合理配置注解和使用EntityManager,可以轻松实现数据的持久化和查询。
希望本文能够帮助你更好地理解和使用JPA的单表继承策略。