一共有三种方式,处理继承映射。必须考虑到数据的冗余度。
- 全部放在一张表
- 父亲的放在一张表,儿子只是保存和父亲不一样的,增加的属性。
- 父亲保存父亲的,儿子保存儿子的。自己管理自己的
一共就上面上种讲的通俗易懂,简单好理解
一种中的来吧
Signal——table
全部放在一个表中使用一个列来区分父子。discriminator n.辨别者,鉴别器;
为了使用鉴别器,我们专门设立了一个列。@DiscriminatorColumn,里面的属性呢有个name 和普通过的@Cloumn一样的性质,还有一个是!discriminatorType ,这个属性说明我们用什么来区分父子的属性
DiscriminatorType.CHAR
DiscriminatorType.INTEGER
DiscriminatorType.STRING
一看就懂了~~
除了这个之外呢还有个
@DiscriminatorValue 来修饰每个类
person下面有Customer 和 employee
@Entity
// 定义辨别者列的列名为person_type,列类型为字符串
@DiscriminatorColumn(name="person_type" ,
discriminatorType=DiscriminatorType.STRING)
// 指定Person实体对应的记录在辨别者列的值为"普通人"
@DiscriminatorValue("普通人")
@Table(name="person_inf")
public class Person
// 顾客类继承了Person类
@Entity
// 指定Customer实体对应的记录在辨别者列的值为"顾客"
@DiscriminatorValue("顾客")
@Table(name="customer_inf")
public class Customer extends Person
// 员工类继承了Person类
@Entity
// 指定Employee实体对应的记录在辨别者列的值为"员工"
@DiscriminatorValue("员工")
@Table(name="employee_inf")
public class Employee extends Person
全部都是放在一张表里面去啦,这样子啦啦啦~~
连接子类映射策略
就是刚刚上面讲的第二种,比较的通俗易懂
这种 策略不是Hibernate默认的继承策略必须定制这种
@Inheritance
InheritanceType.SINGLE_TABLE
InheritanceType.JOINED第二个
InheritanceType.TABLE_PERCLASS 每一个子类
这种策略无需使用辨别者,只要继承树的根实体类上面有这个属性就ok啦
搞定
@Entity
// 指定使用连接子类的映射策略
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name="person_inf")
public class Person
第三种和第二种一样的~没事好说的。每个子类都有一张完整的表,包含自己和父亲的所有属性。