`

hibernate继承映射2

阅读更多

           关于以前写的hibernate继承关系映射,当30多张表的时候,系统开销太大,导致了内存溢出的严重问题,没有办法,只能换一种继承策略了。

            就是30多张表的共用字段都提取出来,在数据库里建一张表,其他表里只有自身的字段。然后在配置文件里面去继承共用的那张表就OK了。其间,只是一些配置文件的细节发生了变化。程序代码一点都不用改变!hibernate真强大啊!说多了没用,上代码!哦。。。先说说例子的大概情况:有一张职员表(这张表就是共用字段),一张小时工表(继承职员表),一张薪水工表(也继承职员表)。

(1)职员表

    

package mypack;

import java.io.Serializable;

public abstract  class Employee implements Serializable ...{

    
private Long id;
    
private String name;
        private String type;
   
    生成get、set方法
}

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
<hibernate-mapping >
   
<class name="mypack.Employee" table="EMPLOYEES" polymorphism="implicit"> 
      
<id name="id" type="long" column="ID">
        
<generator class="native"/>
      
</id>  
      
<property name="name" type="string" column="NAME" />
         <property name="type" type="string" column="type" length="50"/>
    
</class>
</hibernate-mapping>

 

(2)小时工表

       

package mypack;

import java.io.Serializable;

public class HourlyEmployee extends Employee...{

    
private double rate;

   
/** *//** default constructor */
    
public HourlyEmployee() ...{
    }


    
public double getRate() ...{
        
return this.rate;
    }


    
public void setRate(double rate) ...{
        
this.rate = rate;
    }


}

       

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
<hibernate-mapping >
      
<joined-subclass name="mypack.HourlyEmployee" table="HOURLY_EMPLOYEES"  extends="mypack.Employee" >
         
<key column="EMPLOYEE_ID" />
         
<property name="rate" column="RATE" type="double" />
      
</joined-subclass>
</hibernate-mapping>

 

(3)薪水工表

 

package mypack;

import java.io.Serializable;

public class SalariedEmployee extends Employee ...{

    
private double salary;

    
/** *//** default constructor */
    
public SalariedEmployee() ...{
    }


   
public double getSalary() ...{
        
return this.salary;
    }


    
public void setSalary(double salary) ...{
        
this.salary = salary;
    }


}

         

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
<hibernate-mapping >
      
<joined-subclass name="mypack.SalariedEmployee"  table="SALARIED_EMPLOYEES" extends="mypack.Employee" >
         
<key column="EMPLOYEE_ID" />
         
<property name="salary" column="SALARY" type="double" />
      
</joined-subclass>
</hibernate-mapping>

 

最后一步:注意了!把职员表重新命名再映射一遍,这回不是抽象的了。

package mypack;

import java.io.Serializable;

public class jEmployee implements Serializable ...{

    
private Long id;
    
private String name;
    
private String type;
 
    
/** *//** default constructor */
    
public jEmployee() ...{
    }

   
    
//生成get,set方法
}

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
<hibernate-mapping >
   
<class name="mypack.jEmployee" table="EMPLOYEES" >
      
<id name="id" type="long" column="ID">
        
<generator class="native"/>
      
</id>  
      
<property name="name" type="string" column="NAME" />
      
<property name="type" type="string" column="type"  length="50"/>
    
</class>
</hibernate-mapping>

一会说,接着说。

     职位表中的type字段记录着每个子表的表名。

    上面2,3的配置文件采用joined-subclass,hiberntae中的继承有3中,还有两种,一个是union-subclass和subclass。用union-subclass生成的sql语句都是以union形式的,用join-subclass生成的sql语句都是什么什么join。subclass这个方式太简单了,不说了。

   为什么把职位表映射两遍呢?而且最后一遍的映射是没有继承关系的单一文件,而且也不是抽象的。因为hibernate继承映射的话,它会查出它子类的所有的东西,hibernate3.0是这样的。假如说我程序里面想把所有共性的字段以列表的形式查出来,那么hibernate就会把它的子类都查出来,这样开销太大了。所以把员工表单独映射一个纯净的类来解决这个开销问题。

  关于(1)中的配置文件中的polymorphism="implicit"属性,有两个值,即:implicit (隐式)和explicit(显式)两种。默认是implicit。很多人说,把这个属性值设一下,这样按着父类查询是就不会把子类查出来,这是不对的,这种说法并没有理解隐式和显式的真正含义。他们的区别如下:

    implicit(隐式)形式不使用join关键字。关联使用"点号"来进行“引用”。implicit join可以在任何HQL子句中出现.implicit join在最终的SQL语句中以inner join的方式出现。

from Cat as cat where cat.mate.name like '%s%'

Implicit (隐式)的多态是指,如果查询中给出的是任何超类、该类实现的接口或者该类的名字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。 Explicit (显式)的多态是指,只有在查询中给出的明确是该类的名字时才会返回这个类的实例;同时只有当在这个<class>的定义中作为<subclass>或者<joined-subclass>出现的子类,才会可能返回。 大多数情况下,默认的polymorphism="implicit"都是合适的。 显式的多态在有两个不同的类映射到同一个表的时候很有用。(允许一个“轻型”的类,只包含部分表字段)。

分享到:
评论

相关推荐

    Hibernate继承映射代码

    本主题将深入探讨"Hibernate继承映射+C3P0代码"的相关知识点。 首先,让我们理解Hibernate的继承映射。在Java中,我们可以创建一个基类,然后派生出多个子类,这种设计模式在数据库中也可以被映射出来。Hibernate...

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...

    hibernate继承映射.rar

    《Hibernate继承映射详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。在实际项目中,我们常常会遇到类的继承关系,而Hibernate提供了强大的支持来处理这种继承关系的...

    用Hibernate映射继承关系

    ### 用Hibernate映射继承关系 #### 14.1 继承关系树的每个具体类对应一个表 在Hibernate中映射继承关系时,一种常见的策略是将继承关系树的每个具体类映射到单独的数据库表中。这种方法称为**表/类映射**(Table/...

    Hibernate继承映射(annotation)

    **标题:“Hibernate继承映射(Annotation)详解”** 在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在传统的面向对象编程中,继承是实现代码复用和...

    Hibernate继承映射-概述

    《Hibernate继承映射详解》 在Java开发中,对象关系映射(ORM)框架如Hibernate大大简化了数据库操作。Hibernate不仅提供了对基本数据类型的映射,还支持复杂的数据结构,如继承关系的映射。本篇文章将深入探讨...

    hibernate继承映射教学

    针对hibernate的继承映射部分做了几个测试的例子,更加直观的阐述了继承映射的几种方式以及对应的表结构方式,文件被分割成3部分 http://download.csdn.net/source/259075 http://download.csdn.net/source/259072 ...

    Hibernate继承映射

    Hibernate的继承映射 --每个继承层次一张表 -- 每个具体类一张表 -- 每个类一张表

    Hibernate继承映射二:每个子类一张表

    本篇主要探讨的是Hibernate中的继承映射策略,特别是“每个子类一张表”(Table per subclass)的方式。这种方式也被称为单表继承或多表继承,是Hibernate支持的四种继承映射策略之一。了解并熟练掌握这种映射模式...

    Hibernate继承映射的第一种策略:每个具体类一张表

    本篇文章将详细探讨Hibernate继承映射的策略,特别是“每个具体类一张表”(Table Per Concrete Class)的映射方式。 在面向对象编程中,继承是常见的代码复用手段,但在关系型数据库中,这种概念并不直接对应。...

    Hibernate继承映射的第一种策略:每个类对应一张表

    本文将详细探讨“Hibernate继承映射的第一种策略:每个类对应一张表”的概念、实现方式以及其优缺点。 首先,我们需要理解Hibernate继承映射的基本策略。在面向对象编程中,类继承是常见的代码复用手段,但在数据库...

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    Hibernate继承关系映射.pdf

    标题:“Hibernate继承关系映射.pdf” 描述:“简明扼要地介绍了Hibernate中继承关系的映射方式,深入探讨了三种不同的映射策略及其优缺点,同时解析了多态查询的概念。” 知识点: ### Hibernate继承关系映射...

    Hibernate继承映射一:每个类分层结构一张表

    本篇文章主要探讨的是Hibernate的继承映射策略,特别是“每个类分层结构一张表”(Table per Concrete Class)的方式。这种映射策略是Hibernate提供的多种继承映射方案之一,适用于处理复杂的对象模型。 首先,我们...

    Hibernate教程17_继承映射

    在Java世界中,ORM(对象关系映射)框架如Hibernate极大地简化了数据库操作。本教程主要探讨的是Hibernate中的“继承映射...学习并实践这些例子,有助于巩固对Hibernate继承映射的理解,并提升在实际项目中的应用能力。

Global site tag (gtag.js) - Google Analytics