`

hibernate学习笔记第14讲-继承映射

阅读更多

 

继承映射:

1,一个类继承树映射到一张表。一般采用第一种。效率高,资源占用率低。



 1、理解如何映射

           因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的。

这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。用hibernate实现这种策略的时候,有如下步骤:

父类用普通的<class>标签定义

在父类中定义一个discriminator,即指定这个区分的字段的名称和类型

如:<discriminator column=XXX type=string/>

子类使用<subclass>标签定义,在定义subclass的时候,需要注意如下几点:

Subclass标签的name属性是子类的全路径名

Subclass标签中,用discriminator-value属性来标明本子类的discriminator字段(用来区分不同类的字段)       的值Subclass标签,既可以被class标签所包含(这种包含关系正是表明了类之间的继承关系),也可以与class标签平行。 subclass标签的定义与class标签平行的时候,需要在subclass标签中,添加extends属性,里面的值是父类的全路径名称。子类的其它属性,像普通类一样,定义在subclass标签的内部。

2、理解如何存储

存储的时候hibernate会自动将鉴别字段值插入到数据库中,在加载数据的时候,hibernate能根据这个鉴别值  正确的加载对象

多态查询:在hibernate加载数据的时候能鉴别出正真的类型(instanceOf

 

get支持多态查询

load只有在lazy=false,才支持多态查询

hql支持多态查询   

映射关系:

<hibernate-mapping package="com.bjsxt.hibernate">

<class name="Animal" table="t_animal" lazy="false">

           <id name="id">

                    <generator class="native"/>

           </id>

//鉴别器,必须放在id后面          

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

           <property name="name"/>

           <property name="sex"/>

//鉴别值:discriminator-value

           <subclass name="Pig" discriminator-value="P">

                    <property name="weight"/>

           </subclass>

           <subclass name="Bird" discriminator-value="B">

                    <property name="height"/>

           </subclass>

</class>

</hibernate-mapping>

加载:

/**

 * 采用load,通过Pig查询

 */

session.beginTransaction();

                    Pig pig = (Pig)session.load(Pig.class, 1);

                    System.out.println(pig.getName());

                    session.getTransaction().commit();

/**

 * 采用load,通过Animal查询

 */

         session.beginTransaction();

                    Animal animal = (Animal)session.load(Animal.class, 1);

                    System.out.println(animal.getName());

                    session.getTransaction().commit();

/**

 * 采用load,通过Animal查询,不支持多态查询

多态查询:在hibernate加载数据时,能鉴别出真正的类型(instanceof

 */

session.beginTransaction();

                    Animal animal = (Animal)session.load(Animal.class, 1);

                    //因为load默认只是lazy,因为我们看到的是Animal的代理对象

                    //所以通过instanceof是反应不出正真的对象类型的

                    //因此load在默认情况下是不支持多态查询的

                    if (animal instanceof Pig) {

                             System.out.println(animal.getName());

                    }else {

                             System.out.println("不是猪");

                    }

                    session.getTransaction().commit();

/**

 * 采用load,通过Animal查询,<class>标签上的lazy=falseload失效后支持多态查询

 */

session.beginTransaction();

                    Animal animal = (Animal)session.load(Animal.class, 1);

         //可以正确的判断出Pig的类型,因为lazy=false,返回的是具体的Pig类型

           //此时load支持多态查询

                    if (animal instanceof Pig) {

                             System.out.println(animal.getName());

                    }else {

                             System.out.println("不是猪");

                    }

                    session.getTransaction().commit();

/**

 * 采用get,通过Animal查询,能够支持多态查询

 */

session.beginTransaction();

                    //可以正确的判断出Pig的类型,因为返回的是具体的Pig类型

                    //get支持多态查询

                    Animal animal = (Animal)session.get(Animal.class, 1);

                    if (animal instanceof Pig) {

                             System.out.println(animal.getName());

                    }else {

                             System.out.println("不是猪");

                    }

                    session.getTransaction().commit();

         /**

 * 查询所有实体对象,因为支持多态查询

 */

session.beginTransaction();

                    List list = session.createQuery("from java.lang.Object").list();

                    for (Iterator iter=list.iterator(); iter.hasNext();) {

                             Object o = iter.next();

                             if (o instanceof Pig) {

                                       System.out.println("Pig");

                             }else if (o instanceof Bird) {

                                       System.out.println("bird");

                             }

                    }

                    session.getTransaction().commit();

2,每个子类映射到一张表。在加载、存储的性能上比第一种低。



 映射关系:

<hibernate-mapping package="com.bjsxt.hibernate">

      <class name="Animal" table="t_animal">

               <id name="id">

                         <generator class="native"/>

               </id>

               <property name="name"/>

               <property name="sex"/>

               <joined-subclass name="Pig" table="t_pig">

                         <key column="pid"/>

                         <property name="weight"/>

               </joined-subclass>

               <joined-subclass name="Bird" table="t_bird">

                         <key column="bid"/>

                         <property name="height"/>

               </joined-subclass>

      </class>

</hibernate-mapping>

3,每个具体类映射到一张表。



 <hibernate-mapping package="com.bjsxt.hibernate">

// abstract="true"抽象,不会生成表

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

           <id name="id">

//不能使用native,自增,因为pigbird两个表中的id不能相同

                    <generator class="assigned"/>

           </id>

           <property name="name"/>

           <property name="sex"/>

           <union-subclass name="Pig" table="t_pig">

                    <property name="weight"/>

           </union-subclass>

           <union-subclass name="Bird" table="t_bird">

                    <property name="height"/>

           </union-subclass>

</class>

</hibernate-mapping>

 

 

  • 大小: 26.7 KB
  • 大小: 35.8 KB
  • 大小: 29 KB
分享到:
评论

相关推荐

    Hibernate学习笔记特别详细

    《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...

    Hibernate学习笔记整理

    Hibernate学习笔记整理 以下是 Hibernate 框架的详细知识点: Hibernate 介绍 Hibernate 是一个 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。它提供了一个简洁的方式来访问和操作...

    Hibernate---继承

    Hibernate---继承 Hibernate---继承

    Hibernate继承映射代码

    Hibernate提供了四种继承策略:单表继承(Single Table Inheritance)、联合继承( Joined Table Inheritance)、表 per 类继承(Table per Class Inheritance)以及分层继承(Concrete Table Inheritance)。...

    我的hibernate学习笔记(4)完 ---附完整word格式文件

    在本篇“我的Hibernate学习笔记(4)完”中,我们将深入探讨Hibernate这一流行的Java对象关系映射(ORM)框架,以及如何通过源码和工具进行高效开发。这篇笔记不仅包含理论知识,还提供了实际操作的指导,以帮助读者更...

    Hibernate3学习笔记(一)-hibernate概述和简单实例入门

    “Hibernate3学习笔记(一)-hibernate概述和简单实例入门” 这个标题表明了本文档将介绍的是关于Hibernate3的基本概念和初步应用。Hibernate3是Java开发中的一个流行对象关系映射(ORM)框架,它简化了数据库操作,将...

    Hibernate映射笔记

    ### Hibernate映射笔记详解 #### Hibernate映射文件与配置关系 Hibernate映射是ORM(对象关系映射)框架中的一项关键技术,它允许开发者在数据库表和Java对象之间建立映射关系,从而简化了数据访问层的开发工作。...

    Java相关课程系列笔记之十四Hibernate学习笔记

    【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...

    Hibernate学习笔记(1-13)

    【Hibernate学习笔记(1-13)】是传智播客李勇的教程,涵盖了Hibernate框架的基础到进阶内容。Hibernate是一个流行的ORM(对象关系映射)框架,它旨在解决Java面向对象编程与关系型数据库之间的模型不匹配问题,即...

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip)

    Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    hibernate-release-5.2.10

    Hibernate是Java平台上的一款开源对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作。在SSH(Spring、Struts、Hibernate)框架中,Hibernate作为持久层的解决方案,极大地简化了数据库操作的...

    hibernate框架开发2016版视频 四天学习笔记完整版

    【hibernate框架开发2016版视频 四天学习笔记完整版】 在软件开发领域,特别是Java Web开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作,使开发者可以更专注于业务逻辑而不是...

    hibernate 学习笔记精要

    hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要

    Hibernate_实体关联关系映射--学习总结

    Hibernate是目前广泛使用的持久层框架,它采用对象关系映射(ORM)技术,将Java对象映射到关系型数据库中。在使用Hibernate进行数据持久化操作时,如何处理实体之间的关联关系是一个非常重要的方面。实体关联关系映射...

    hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd

    《深入理解Hibernate配置与映射:hibernate-configuration-3.0.dtd与hibernate-mapping-3.0.dtd解析》 在Java世界里,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而`hibernate-...

    hibernate学习笔记文档

    ### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(ORM)框架,它实现了将 Java 应用程序中的对象模型映射到关系型数据库中的记录。通过 ORM 技术,...

    马士兵hibernate学习笔记

    ### 马士兵Hibernate学习笔记知识点总结 #### 一、HelloWorld示例 - **目的**:通过简单的示例理解Hibernate的基本使用流程。 - **步骤**: - 创建Java项目`hibernate_0100_HelloWorld`。 - 建立库依赖,包括...

    Hibernate实体关联关系映射--学习总结.pdf

    Hibernate实体关联关系映射--学习总结.pdf

Global site tag (gtag.js) - Google Analytics