JPA支持继承关系,使开发者可以利用继承的思想建模。
有一个实体Person,他是一个抽象实体,他有两个子实体:Man,Woman。
先写Person类:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
//@DiscriminatorColumn(name="tableName")可选
public class Base implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Date createTime = new Date();
@Id
@GeneratedValue
private int id;
。。。
}
注意,对于抽象父类,必须设置两个注释:
1. Inheritance strategy:用来声明继承策略。可选值是InheritanceType.SINGLE_TABLE(为类继承体系中的每个类创建一张相同的表)、InheritanceType.JOINED(为类继承体系中的每个类创建不同的表)和InheritanceType .TABLE_PER_CLASS(将属性映射到子类中)。缺省值是InheritanceType.SINGLE_TABLE,表示只生成一张表。
2. DiscriminatorColumn name:用来说明子类使用那个字段区分,这里使用sex字段区分Man实体和Woman实体。
编写Man类和Woman类:
@Entity
//@DiscriminatorValue(value="users")可选
public class Users extends Base implements Serializable {
private String remark="";
。。。
}
@Entity
//@DiscriminatorValue(value="role")可选
public class Role extends Base implements Serializable {
private String name = "";
。。。
}
InheritanceType.JOINED生成多张表:
DiscriminatorColumn、 DiscriminatorValue不要设置,
数据库中有3张表:base(id,createTime)、users(id,remark)、role(id,name)
添加user:
Hibernate: insert into Base (createTime) values (?)
Hibernate: insert into Users (remark, id) values (?, ?)
添加role:
Hibernate: insert into Base (createTime) values (?)
Hibernate: insert into Role (name, id) values (?, ?)
删除同删、修改同改、添加同加。
InheritanceType.SINGLE_TABLE生存同一张表:
子类实体只需要设置DiscriminatorValue属性,当sex值为0时表示Man对象(此对象的womanService字段为null),当sex值为1时表示Woman对象(此对象的manService字段为null)。
数据库有1张表:base(id,createTime,remark,name);
InheritanceType .TABLE_PER_CLASS生成多张表:
DiscriminatorColumn、 DiscriminatorValue不要设置,
数据库中有2张表: users(id,remark,createTime)、role(id,name,createTime)
关于主键自增+加以下标识
@GeneratedValue(strategy = GenerationType.TABLE, generator = "customer_gen")
@TableGenerator(
name = "customer_gen",
table = "tb_generator_auto",
pkColumnName = "gen_name",
valueColumnName = "gen_value",
pkColumnValue = "CUSTOMER_PK",
allocationSize = 1
)