在JPA中,实体类支持继承关系,并且支持多种继承映射策略。
主要的继承映射策略有:
- 单表策略:父类和子类使用同一张表,通过discriminator列来区分不同的类型。
使用@Inheritance(strategy = InheritanceType.SINGLE_TABLE)指定。 - 联表策略:父类和子类各自使用独立的表,子表包含对父表的外键关联。
使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)指定。 - 子类表策略:父类使用独立的表,子类使用统一的表,子表包含对父表的外键关联。
使用@Inheritance(strategy = InheritanceType.JOINED)指定。
一个简单的例子:
//父类
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Person {
@Id
private Long id;
private String name;
public Person() {}
}
//子类
@Entity
public class Employee extends Person {
private double salary;
public Employee() {}
}
//子类
@Entity
public class Customer extends Person {
private String mobile;
public Customer() {}
}
在该例子中,Person、Employee和Customer实体采用联表继承策略,每个实体各自有独立的表,Employee表和Customer表都包含一个person_id字段关联Person表。
所以,JPA支持实体间的继承关系及多种继承映射策略,我们需要根据实际需求选择合适的映射策略。这需要我们不仅要理解各种继承映射的实现原理,更需要对业务模型和数据库设计有比较深入的思考和判断。