JPA 实体继承的三种策略详解
JPA 实现继承主要有三种类型。假设有 A、B、C 三个类,A 为基类,B、C 均为 A 的子类。那么三种设计方式分别为:
- A、B、C 共用一张表。
- 每个类分层结构一张表,A、B、C 各一张表,各自包含自己的属性。
- 每个具体类一张表(Table Per Concrete Class)。
1. 共用一张表 (SINGLE_TABLE)
首先定义基类(本例以文件为例,子类分别为文件夹和文件)。
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "window_file")
@DiscriminatorColumn(name = "Discriminator",
discriminatorType = DiscriminatorType.STRING,
length = 30)
@DiscriminatorValue("WindowFile")
public class WindowFile {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Basic
@Column(name = "name")
private String name;
@Basic
@Column(name = "type")
private String type;
@Basic
@Column(name = "date")
private String date;
// getter setter......
}
分别再定义两个子类:
@Entity
@DiscriminatorValue("Folder")
public class Folder extends WindowFile {
@Basic
@Column(name = "file_count")
private Integer fileCount;
public Integer getFileCount() {
return fileCount;
}
public {
.fileCount = fileCount;
}
}


