Hibernate继承关系

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

其中后两个类是继承自员工类,有两种映射方法
第一种:
Employee.hbm.xml中应该这样写:
 

<subclass/>标签表示类Skiller是继承自Employee,用属性(也叫鉴别器)discriminator-value来区分各种类型
的员工,缺省值为0
这种映射方法,一般子类的属性应该大致相同,因为他把整个继承树都表现在了Employee表中,
子类的每一个属性都是Employee表中的字段,这样每次插入数据,或者查询等操作数据只操作一张表
效率上会提高很多,但是这样的话,如果子类(也就是员工的类型有很多的时候)很多,并且有不同的属性的
时候,每当有新类型员工类型加入,就会修改Employee表结构,一般不合常理。
第二种:
Employee.hbm.xml中应该这样写:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值