EJB3支持三种类型的继承映射:
• 每个类一张表(Table per class)策略: 在Hibernate中对应元素:
• 每个类层次结构一张表(Single table per class hierarchy)策略:在Hibernate中对应元素
• 连接的子类(Joined subclasses)策略:在Hibernate中对应 元素
一、每个类层次结构一张表【整个继承层次结构中的父类和子类的所有属性都映射在一张表中】:通过区分符来区分discriminator
@Inheritance 和 @DiscriminatorColumn 注解只能用于实体层次结构的顶端.
在下面的例子中,person是父类,在这个类里面讲继承策略定义为InheritanceType.SINGLE_TABLE,并通过@DiscriminatorColumn注释定义了辨别符列(还可以定义辨别符的类型)。最后,对于继承层次结构中的每个类,,@DiscriminatorValue注释指定了用来辨别该类的值。辨别符列的名字默认是DTYPE,其默认值为实体名,默认类型是DiscriminatorType.STRING.
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)//继承策略是每个类层次结构映射一张表
@DiscriminatorColumn(name="discrimitor",discriminatorType=DiscriminatorType.STRING)//定义了辨别符列,和辨别符的类型
//上面的两行注解只能用于实体层次结构的顶端
@DiscriminatorValue("person")//用于辨别该类的值
public class Person {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
student继承父类person【@DiscriminatorValue】
@Entity
@DiscriminatorValue("student")
public class student extends Person {
private int score;
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
//teacher表类似,略
通过这种方式,则person表中会有父类和子类所有的属性和区分符,当某个子类的字段较多时,会造成存储空间大量的浪费
create table Person (
discrimitor varchar(31) not null,
id integer not null auto_increment,
name varchar(255),
title varchar(255),
score integer,
primary key (id)
)
Read:当指定是哪个子类时,会依据 student0_.id=? and student0_.discrimitor=’student’来搜索
当没有指定时,就会按照父类id进行搜索 person0_.id=?
@Test
public void testGet() {
testSave();
Session session=sf.getCurrentSession();
session.beginTransaction();
student s=(student) session.get(student.class, 1);
/*
* 指定取哪个对象,则只会输出该对象的信息
select
student0_.id as id0_0_,
student0_.name as name0_0_,
student0_.score as score0_0_
from
Person student0_
where
student0_.id=?
and student0_.discrimitor='student'
*/
Person p=(Person) session.get(Person.class, 2);
/*
* 没有指定是哪个对象,则会select person中的所有项
select
person0_.id as id0_0_,
person0_.name as name0_0_,
person0_.title as title0_0_,
person0_.score as score0_0_,
person0_.discrimitor as discrimi1_0_0_
from
Person person0_
where
person0_.id=?
*/
session.getTransaction().commit();
}
二、