文档章节

学习hibernate(六) -- hibernate继承

XuePeng77
 XuePeng77
发布于 2016/04/07 22:55
字数 713
阅读 42
收藏 5

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

继承关系

    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);
    }


    在看看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>

    最后看一下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>

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

© 著作权归作者所有

XuePeng77
粉丝 49
博文 153
码字总数 205910
作品 0
丰台
私信 提问
Java程序员从笨鸟到菜鸟全部博客目录【2012年十一月七日更新】

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,...

长平狐
2012/11/12
145
0
Java程序员从笨鸟到菜鸟全部博客目录【2012年十一月七日更新】

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,...

长平狐
2012/11/12
237
0
Hibernate 学习资料汇总

1.Hibernate系列——总结篇(http://blog.csdn.net/jiuqiyuliang/article/details/41318751) 2.Hibernate框架简述(http://www.cnblogs.com/eflylab/archive/2007/01/09/615338.html) 3.Hiber......

IT追寻者
2016/08/06
30
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
288
0
《Java程序员由笨鸟到菜鸟》电子版书正式发布,欢迎大家下载

在众多朋友的支持和鼓励下,《Java程序员由菜鸟到笨鸟》电子版终于和大家见面了。本电子书涵盖了从java基础到javaweb开放框架的大部分内容。在编写的过程中,难免会出现一些错误,希望大家能...

长平狐
2012/11/12
169
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis面试题详解:哨兵+复制+事务+集群+持久化等

Redis主要有哪些功能? 1.哨兵(Sentinel)和复制(Replication) Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。 Sentinel...

Java阿七
12分钟前
2
0
响应国家号召 1+X 证书 Web 前端开发考试模拟题

官方QQ群:736413913 1+x证书Web前端开发初级理论考试样题2019 http://blog.zh66.club/index.php/archives/149/ 1+x证书Web前端开发初级实操考试样题2019 http://blog.zh66.club/index.php/...

张帅个人博客
17分钟前
3
0
如何检查一个字符串在Objective-C中是否包含另一个字符串?

如何检查字符串( NSString )是否包含另一个较小的字符串? 我希望有这样的东西: NSString *string = @"hello bla bla";NSLog(@"%d",[string containsSubstring:@"hello"]); 但是我能找到......

javail
34分钟前
2
0
.NET Core开发的iNeuOS工业互联网平台,发布 iNeuDA 数据分析展示组件,快捷开发图形报表和数据大屏

目 录 1. 概述... 2 2. 演示信息... 2 3. 简单介绍... 3 4. 产品特点... 4 5. 价值体现... 5 1. 概述 经过一段时间的努力,iNeuDA产品组件已经开发和测试完成,现在正式上线。现在iNeuOS工业...

wxzz
36分钟前
3
0
在每个GROUP BY组中选择第一行?

顾名思义,我想选择以GROUP BY分组的每组行的第一行。 具体来说,如果我有一个如下的purchases表: SELECT * FROM purchases; 我的输出: id | customer | total---+----------+------ 1...

技术盛宴
49分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部