在hibernate中,对于映射表有三种映射继承关系:
一.subclass类型:这种类型是将有继承关系的多个实体类放到同一张数据表中,在映射表中通过添加辨别列加以区分各个不同的对象,对于子类独有的字段,在父类对象中是为空的。
优点:
1. 只用一张数据表,便与查询
2.查询性能较好
缺点:
1.子类独有的字段在数据表中不能添加非空的限制
2.当继承关系较深的时候,在数据表中的字段会变得很多,不便于维护
代码实例:
实体类父类:
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;
}
}
Persion.hbm.xml配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-23 10:28:21 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.subclass.Person" table="PERSONS" discriminator-value="person">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<!-- 添加识别者类 -->
<discriminator column="TYPE" type="java.lang.String"></discriminator>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<!-- 配置subclass子类 -->
<subclass name="com.subclass.Student" discriminator-value="STUDENT">
<property name="school" type="java.lang.String" column="SCHOOL"></property>
</subclass>
</class>
</hibernate-mapping>
二:joined-subclass类型。这种类型将父类的字段放在一个数据表中,子类继承字段放在父类数据表中,独有字段放在另外一个数据表中,并通过外键的形式与放在父类数据表中的子类字段联系起来。
优点:
1.可以可以添加非空属性
缺点:
1保存操作性能不高
代码实例:
实体类是一样的,不同的只是映射配置文件不同而已:
配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-23 10:28:21 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.joinclass.Person" table="PERSONS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<!-- 配置unionclass子类 -->
<union-subclass name="com.joinclass.Student" table="STUDENTS">
<property name="school" column="SCHOOL" type="java.lang.String"></property>
</union-subclass>
</class>
</hibernate-mapping>
三:union-subclass类型。这种类型比较符合我们对数据库的直观了解,为实体类分别创建一张数据表
优点:
1.直观
2.查询性能不错
缺点:
1.字段冗余
2.更行性能不行
看实例代码:
实体类同上,映射配置文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-23 10:28:21 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.joinclass.Person" table="PERSONS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<!-- 配置unionclass子类 -->
<union-subclass name="com.joinclass.Student" table="STUDENTS">
<property name="school" column="SCHOOL" type="java.lang.String"></property>
</union-subclass>
</class>
</hibernate-mapping>
至此,三种映射文件的继承关系就这样,各有优缺点。在继承关系的选择上应当取决于实际的开发项目。