学习hibernate(六) -- hibernate继承

继承关系

    hibernate的继承关系有三种,分别是:


说明
优点
缺点
subclass
父类子类保存在同一张表,通过一个辨别字段区分类型。
所有数据都保存在一张表,性能略高。
存在多余的字段。字段必须允许为null。
joined-subclass
父类子类相同的字段保存在同一张表,子类独有的字段存在另一张表。
不存在多余的字段。
需要维护的表的数量增多。
union-subclass
父类子类都有独立的表。
关系清晰明确。
有多余的字段,操作时候需要维护多张表,性能不高。

    介绍完三种关系后,一个一个的进行测试。

    首先来看看subclass是如何实现继承关系的。下面是两个类person和student的代码,student继承了person,并且添加了一个school属性:

package cn.net.bysoft.model1;

public class Person {
    // getter and setter
    private int id;
    private String name;
}
package cn.net.bysoft.model1;

public class Student extends Person {

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }

    private String school;
}

    接下来是*.hbm.xml配置文件,使用了discriminator辨别类型节点,并且在class节点中加入了discriminator-value属性,具体来看下配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.net.bysoft.model1.Person" table="PERSON" discriminator-value="PERSON">
        <id name="id" type="integer" column="ID">
            <!-- 指定主键的生成方式,native是使用数据库本地的方式 -->
            <generator class="native"></generator>
        </id>
        <!-- 辨别字段 -->
        <discriminator column="TYPE" type="string"></discriminator>
        <property name="name" type="string" column="NAME"></property>
        <subclass name="cn.net.bysoft.model1.Student" discriminator-value="STUDENT">
            <property name="school" type="string" column="SCHOOL"></property>
        </subclass>
    </class>
</hibernate-mapping>

    测试一个save方法,看一看生成的数据表:

    @Test
    public void testSubClassSave() {
        Person person = new Person();
        person.setName("Jack");
        Student student = new Student();
        student.setName("XiaoMing");
        student.setSchool("Two");
        
        session.save(person);
        session.save(student);
    }

222017_HrUC_2450666.png

    在看看joined-subclass,对象不用改变,save方法也不用修改,只修改一下配置文件即可,不在需要辨别类型,直接加入joined-subclass节点:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.net.bysoft.model1.Person" table="PERSON">
        <id name="id" type="integer" column="ID">
            <!-- 指定主键的生成方式,native是使用数据库本地的方式 -->
            <generator class="native"></generator>
        </id>

        <property name="name" type="string" column="NAME"></property>
        
        <joined-subclass name="cn.net.bysoft.model1.Student" table="STUDENT">
            <key column="STUDENT_ID"></key>
            <property name="school" type="string" column="SCHOOL"></property>
        </joined-subclass>
    </class>
</hibernate-mapping>

224430_Gv0b_2450666.png

224431_1BgD_2450666.png

    最后看一下union-subclass是如何配置的,直接修改配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.net.bysoft.model1.Person" table="PERSON">
        <id name="id" type="integer" column="ID">
            <!-- 指定主键的生成方式,native是使用数据库本地的方式 -->
            <generator class="hilo"></generator>
        </id>

        <property name="name" type="string" column="NAME"></property>
        
        <union-subclass name="cn.net.bysoft.model1.Student" table="STUDENT">
            <property name="school" type="string" column="SCHOOL"></property>
        </union-subclass>
    </class>
</hibernate-mapping>

225316_IeLC_2450666.png

225316_OKkk_2450666.png

    这里注意,使用union-subclass时,父类的主键生成方式不能是native。

转载于:https://my.oschina.net/u/2450666/blog/654819

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值