JPA 继承方式
@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 Date date;//省略get set}
@Entity@DiscriminatorValue("Folder")public class Folder extends WindowFile {@Basic@Column(name = "FILE_COUNT")private Integer fileCount;//省略get set}
?
@Entity@DiscriminatorValue("Document")public class Document extends WindowFile {@Basic@Column(name = "SIZE")private String size;//省略get set}?
?以上通过列DISCRIMINATOR的不同,区分具体父子实体。
?
实际表结构如下:
WINDOW_FILE? DISCRIMINATOR,ID,NAME,DATE,TYPE,SIZE,FILE_COUNT
?
当你使用WindowFile实体时,实际表的字段为DISCRIMINATOR='WindowFile',SIZE与FILE_COUNT永远是空
当使用Folder实体时,DISCRIMINATOR='Folder',SIZE永远是空,FILE_COUNT为实际值。
Document同理,与Folder类似。
?
@Entity@Table(name = "T_ANIMAL")@Inheritance(strategy = InheritanceType.JOINED)public class Animal {@Id@Column(name = "ID")@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;@Column(name = "NAME")private String name;@Column(name = "COLOR")private String color;//省略get set}
?
@Entity@Table(name = "T_BIRD")@PrimaryKeyJoinColumn(name = "BIRD_ID")public class Bird extends Animal {@Column(name = "SPEED")private String speed;//省略get set}?
@Entity@Table(name = "T_DOG")@PrimaryKeyJoinColumn(name = "DOG_ID")public class Dog extends Animal {@Column(name = "LEGS")private Integer legs;//省略get set}?
?
实际表结构如下:
T_ANIMAL? ID,COLOR,NAME
T_BIRD? SPEED,BIRD(既是外键,也是主键)
T_DOG? LEGS,DOG_ID(既是外键,也是主键)
@Entity@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)@Table(name = "T_VEHICLE")public class Vehicle { // 基类@Id// @GeneratedValue@Column(name = "ID")private Integer id;@Column(name = "SPEED")private Integer speed;// 速度//省略get set}
@Entity@Table(name = "T_CAR")public class Car extends Vehicle {@Column(name = "ENGINE")private String engine;// 发动机//省略get set}
?
一旦使用这种策略就意味着你不能使用AUTO generator 和IDENTITY generator,即主键值不能采用数据库自动生成。
?
实际表结构如下:
T_VEHICLE? ID,SPEED
T_CAR? ID,SPEED,ENGINE
?