JPA实体继承的映射
1、父类只存在实体公共字段查询
@MappedSuperclass public class Model implements Serializable{ private Date createdAt; private Date updatedAt; //省略getter、setter }
@Entity @IdClass(value = PartyPK.class) @Table(name = "account") public class Account extends Model{ @Id private String partyId; @Id private String accountTypeId; @OneToOne @JoinColumn(name = "account_type_id",insertable = false,updatable = false) private AccountType accountType; private String account; private String password; private String passwordSalt; private String headImage; //省略getter、setter }
2、实体继承实体
继承映射使用@Inheritance来注解,它的strategy属性的取值由枚举InheritanceType来定义(包括SINGLE_TABLE、TABLE_PER_CLASS、JOINED,分别对应三种继承策略)。@Inheritance注解只能作用于继承结构的超类上。如果不指定继承策略,默认使用SINGLE_TABLE。
JPA提供了三种继承映射策略:
①、 一个类继承结构一个表的策略。这是继承映射的默认策略。即如果实体类B继承实体类A,实体类C也继承自实体A,那么只会映射成一个表,这个表中包括了实体类A、B、C中所有的字段,JPA使用一个叫做“discriminator列”来区分某一行数据是应该映射成哪个实体。注解为:@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
②、 联合子类策略。这种情况下子类的字段被映射到各自的表中,这些字段包括父类中的字段,并执行一个join操作来实例化子类。注解为:@Inheritance(strategy = InheritanceType.JOINED)
③、 每个具体的类一个表的策略。注解为:@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Entity
@Table(name = "model")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "model_type")
public class Model implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
protected String name;
//省略 getter、setter
}
@Entity
@DiscriminatorValue("test1")
public class Test extends Model{
private String age;
//省略getter、setter
}