hibernate的继承关系

继承关系:

对于pojo类,Employee中放所有员工的相同属性,不同的子类就只放子类的特有属性,子类再继承父类

如:

                   Employee (员工表)  

  Seller(员工中的销售人员)                Skiller(员工中的技术人员)

对于继承关系分为四种情况:

1,当子类中的特有属性很少,可以直接建立在一张表的基础上

<class name="Employee" discriminator-value="0"> 

<id name="empId">

<generator class="native"/>

</id>

<!-- 这里就是相当于type,在一张表中来区分到底是哪个类型的员工,对于不同类型的员工赋予不同的标志值 -->

    <discriminator column="type" type="int"/>

<property name="empName"></property>

<!-- 一张表关系 -->

         <subclass name="Seller" discriminator-value="1"> //放在id标签的后面

<property name="sellNum"></property>

</subclass>

<subclass name="Skiller" discriminator-value="2">

<property name="skill"></property>

</subclass> 

</class>

    在数据中只会出现一张表与之对应,操作的时候效率较高,但是会出现很多的空字段,这个不符合关系数据的要求

2,对于子类的特有属性比较多,需要每个子类都对应着一张表,如果全部放着一张表中就会有太多的字段

  <class name="Employee"> 

<id name="empId">

<generator class="native"/>

</id>

         <property name="empName"></property>

        <joined-subclass name="Seller" table="seller">

        

<!-- 这个外键名字是seller表中的主键,值和Employee中的id相同  -->

    <key column="emp_id"/>       

        <property name="sellNum"></property>

</joined-subclass>

<joined-subclass name="Skiller" table="skiller">

<key column="emp_id"/>

<property name="skill"></property>

</joined-subclass>

</class>

对于此种映射,不需要写区别的列了 discrimination了,用的是外键,但是对于每个子类都必须要对应着一张表,如果子类很多的话,就会出现很多的表

3,对于有些子类的字段很多,但是有些子类的字段很少的情况下,可以综合上面的两种解决办法

<class name="Employee" discriminator-value="0"> 

<id name="empId">

<generator class="native"/>

</id>

  <discriminator column="type" type="int"/>

 <subclass name="Skiller" discriminator-value="1">

<property name="skill"></property>

  </subclass>

<subclass name="Seller" discriminator-value="2">

<join table="seller"> //注意这里跟joined-subclass的区别

<key column="emp_id"/> //通过外键

<property name="sellNum"/>

</join>

 </subclass> 

</class>

4,对于每个子类对应着一个完整的表,把父类中的公共属性也加入到每个子类的数据库中的字段中

<class name="Employee" abstract="true"> 

<!-- 这里如果不设置为抽象的话,在union-subclass配置下会产生一个employee表-->

<id name="empId">

<!--因为empId不能相同,所以每个表在生成主键的时候不能生成相同的主键,因为hibernate通过主键来找记录,只能是唯一的-->

<generator class="hilo"/> 

</id>

<union-subclass name="Seller" table="seller">

<property name="sellNum"></property> <!-- 每个子类的特有属性 -->

</union-subclass>

<union-subclass name="Skiller" table="skiller">

<property name="skill"></property>

</union-subclass>

</class>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值