JPA中的实体类可以是继承关系吗?如何实现继承关系的映射?

在JPA中,实体类支持继承关系,并且支持多种继承映射策略。
主要的继承映射策略有:

  1. 单表策略:父类和子类使用同一张表,通过discriminator列来区分不同的类型。
    使用@Inheritance(strategy = InheritanceType.SINGLE_TABLE)指定。
  2. 联表策略:父类和子类各自使用独立的表,子表包含对父表的外键关联。
    使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)指定。
  3. 子类表策略:父类使用独立的表,子类使用统一的表,子表包含对父表的外键关联。
    使用@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支持实体间的继承关系及多种继承映射策略,我们需要根据实际需求选择合适的映射策略。这需要我们不仅要理解各种继承映射的实现原理,更需要对业务模型和数据库设计有比较深入的思考和判断。