读书人

JPA 兑现继承关系

发布时间: 2012-06-28 15:20:03 作者: rapoo

JPA 实现继承关系

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;

。。。

}

?

注意,对于抽象父类,必须设置两个注释:

?

编写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
???)

读书人网 >软件架构设计

热点推荐