Hibernate继承关系

    技术2026-04-21  4

    继承关系以员工(Employee)和员工类型(销售类员工(Sales),技术类员工(Skiller))表位例子说明:

    public class Employee { private int id; private String name; private Department depart; } public class Sales extends Employee{ private int sell; } public class Skiller extends Employee{ private String skill; }

    其中后两个类是继承自员工类,有两种映射方法第一种:Employee.hbm.xml中应该这样写: <hibernate-mapping package="cn.dyc.domain"> <class name="Employee" discriminator-value="0"> <id name="id"> <generator class="native"></generator> </id> <discriminator column="type" type="int"></discriminator> <property name="name"/> <many-to-one name="depart" column="depart_id"/> <! -- Employee类的子类标签的表示方法 -- > <subclass name="Skiller" discriminator-value="1"> <property name="skill"></property> </subclass> <subclass name="Sales" discriminator-value="2"> <property name="sell"></property> </subclass> </class> </hibernate-mapping>

    <subclass/>标签表示类Skiller是继承自Employee,用属性(也叫鉴别器)discriminator-value来区分各种类型的员工,缺省值为0这种映射方法,一般子类的属性应该大致相同,因为他把整个继承树都表现在了Employee表中,子类的每一个属性都是Employee表中的字段,这样每次插入数据,或者查询等操作数据只操作一张表效率上会提高很多,但是这样的话,如果子类(也就是员工的类型有很多的时候)很多,并且有不同的属性的时候,每当有新类型员工类型加入,就会修改Employee表结构,一般不合常理。第二种:Employee.hbm.xml中应该这样写:<hibernate-mapping package="cn.itcast.domain"> <class name="Employee"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <many-to-one name="depart" column="depart_id"/> <joined-subclass name="Skiller" table="skiller"> <!-- 外键名称 --> <key column="emp_id"/> <property name="skill"/> </joined-subclass> <joined-subclass name="Sales" table="sales"> <!-- 外键名称 --> <key column="emp_id"/> <property name="sell"/> </joined-subclass> </class>

    </hibernate-mapping>第二种映射方法的特点是:每个类都会映射到一张表中,插入新类型员工,重新新建表保存数据,不会修改Employee表的结构,但是效率上就会有所下降,一条员工信息的插入不仅要插入Employee表,还要插入子类的表中,不过这样更符合表结构这种映射的缺点是:查询数据是子类和父类连接查询,如果没有指定查询的具体子类,Hibernate就要对sql语句增加多个条件进行查询,而第一种映射只在一张表中查询,明显没有第一种效率高

    总结两种映射方法,各有优缺点,可根据实际情况使用不用的映射方法.

    当然也可以把两种方法混合起来使用:那么Employee.hbm.xml中应该这样写:<hibernate-mapping package="cn.itcast.domain"> <class name="Employee" discriminator-value="0">  <id name="id">   <generator class="native"></generator>  </id>  <discriminator column="type" type="int"></discriminator>  <property name="name"/>  <many-to-one name="depart" column="depart_id"/>    <subclass name="Skiller" discriminator-value="1">   <property name="skill"></property>  </subclass>  <subclass name="Sales" discriminator-value="2">   <join table="sales">    <key column="emp_id"></key>    <property name="sell"></property>   </join>  </subclass> </class>

    </hibernate-mapping>说明:如果子类中某一个类的属性很多的情况下,可以单独建一个表保存数据,配置方法就如上面所示;

    最新回复(0)