hibernate支持三种继承映射策略:
使用subclass进行映射
将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承和多态。
使用joined-subclass进行映射
对于继承关系中的子类使用通一个表,这就是需要在数据库表中增加额外的区分子类类型的字段。
使用union-subclass进行映射
域模型中的每个类型映射到一个表,通过关系数据模型中的外键来描述表之间的继承关系。
这也就相当于按照域模型的结构来建立关系数据库中的表,并通过外键来建立表之间的继承关系。
1.使用subclass进行映射
将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承和多态。
person父类
public class Person {
private Integer id;
private String name;
private int age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
学生子类
public class Student extends Person {
private String school;
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
}
这里只需要一个person类的hbm映射文件
映射文件中需要添加对应的映射,该模型中只需要添加一个映射文件,因为只生成一张表,
在映射文件中添加对应的子类映射,使用subclass标签,标签中添加鉴别器discriminator-value,
该鉴别器属性指明了在数据库中写入数据时指示写入的是何种类型
<hibernate-mapping package="com.mamh.hibernate.demo.entities">
<class name="Person" table="hb_person" schema="mage" discriminator-value="person">
<id name="id">
<column name="hb_id"/>
<generator class="native"/>
</id>
<discriminator type="java.lang.String" column="type"/>
<property name="name" type="java.lang.String">
<column name="hb_name"/>
</property>
<property name="age" type="int">
<column name="hb_age"/>
</property>
<!--映射子类 使用subclass-->
<subclass name="Student" discriminator-value="student">
<property name="school" type="java.lang.String">
<column name="hb_school"/>
</property>
</subclass>
</class>
</hibernate-mapping>
插入操作
@Test
public void testSavePerson(){
//插入操作对于子类对象只需包记录擦人到一张表中。
// 辨别者列由hibernate自动维护。