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
}

被折叠的 条评论
为什么被折叠?



