`

hibernate继承关系映射和java反射机制的运用

阅读更多

                  hibernate继承关系映射大概有5种,这5种继承关系映射里面,我觉得最有效最常用的一种方式非常好.就说说这种吧.先来说说hibernate继承关系什么时候使用.

             (1) hibernate继承关系什么时候使用?

             很多例子都是说一个动物类,然后是老虎类啊,狮子类啊之类去继承动物类.例子很好,但是实际应用中我根据这个提出了一个完全可行的解决方案,很有成就感!

             在项目里面,遇到这样一个问题,大概有30多张表,里面都有共性的字段,每张表都需要走审核流程,如果针对每张表都做相应的审核模块,代码重复不说,那工作量就大了.针对这个就需要用到hibernate继承关系映射了,所有共性的字段都提取出来,把审核模块做成公共的模块!这中间又涉及用到了java反射机制.

            (2)开始例子

            先把30多张表共性的字段整理出来, id主键字段(String 类型的 主键生成方式是uuid),因为uuid按着计算,据说得300年才能出现重复的数据,300年以后我早就入古了,软件维护找我,嘿嘿,连骨灰都没喽!得了,跑题了.......继续!

          共有的字段:

         id     varchar   32

         fileName   varchar  100

        audState    varchar  2

        tableName  varchar  50 (这个字段存表名,表1的名字table1,就存table1,表2的名字table2,就存table2......反射时候用)

          上面是所有表中共有的字段.再拿30多张表中的一张table1表来举例子吧.table1表里面自己特有的字段如下:

         isDel   varchar  2

        fileTypeId   int    4

        code1   varchar   50

        code2   varchar  50

        code3   varchar  50

         hibenrate继承关系映射开始了

        把共有的字段提出来做一个配置文件TcommTable.hbm.xml

        

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    
<class name="com.hibernate.po.TcommTable" abstract="true" dynamic-insert="true">
        
<id name="id" type="string">
            
<column name="id" />
            
<generator class="uuid" />
        
</id>
        
<property name="fileName" type="string">
            
<column name="fileName" length="100" />
        
</property>        
        
<property name="audState" type="string">
            
<column name="audState" length="2" />
        
</property>
        
 <property name="tableName" type="string" insert="false">
            
<column name="tableName" length="32" />
        
</property>
    
</class>
</hibernate-mapping>

上面的配置文件是抽象的abstract="true" .

要生成相应的po:

        public abstract class TcommTable implements Serializable {

                private String id;

                private String fileName;

               private String tableName;

              //生成set/get()方法

        }

table1表特有的字段生成配置文件和po,都是TcommTable 的子类

table1表的配置文件Table1.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
    
<union-subclass name="com.hibernate.po.Table1" table="Table1" extends="com.hibernate.po.TcommTable ">
      
            
            
<property name="isDel" type="string">
                
<column name="isDel" length="2" />
            
</property>
          
              <property name="fileTypeId" type="integer">
                
<column name="fileTypeId" />
            
</property>
              <property name="code1" type="string">
                
<column name="code1" length="50" />
            
</property>
              <property name="code2" type="string">
                
<column name="code2" length="50" />
            
</property>
              <property name="code3" type="string">
                
<column name="code3" length="50" />
            
</property>
   
      
</union-subclass>
</hibernate-mapping>

 

  table1的po:

    public class Table1  extends TcommTable {


                 private String isDel;    

                 private String fileTypeId;

                 private String code1;

                 private String code2;

                 private String code3;

                 //生成set/get()方法

        }

       (2)运用java的反射机制实现模块的共用性

       当30多张表公用一个审核模块的时候,把抽象类TcommTable传到审核模块,如何知道这个抽象类是那张具体的表呢?就用到了java反射机制了,因为抽象类无法new出对象来,所以就要用java反射机制.

      在审核的action里面实现java的反射机制,主要代码如下:

     String tableName = request.getParameter("tableName");

     String allName = "com.hibernate.po." + tableName;

    TcommTable tomm = (TcommTable) Class.forName(allName).newInstance();

    这样,就能得到table1所有的字段(公共字段和table1特有的字段),然后把要审核的内容放进tomm这个对象里面就行了.注意,java反射机制必须要带上类的完整包名,否则反射出错.tableName字段是区分30多张表的识别字段,通过这个字段,hibernate就自动可以判断出是哪个表和相应的类了,然后通过反射就能得到相应类的所有字段了,因为公共字段放在一个抽象类里面,抽象类无法new对象,所以只能通过反射机制来实现了.

 

分享到:
评论
2 楼 tkiicpp 2010-05-21  
very good
let me try
1 楼 tkiicpp 2010-05-21  
very good, let me try:)

相关推荐

    Java反射机制学习(二)

    在Java编程语言中,反射机制是一项强大的工具,它允许程序在运行时检查并操作类、接口、字段和方法的信息。这篇博文"Java反射机制学习(二)"可能...通过阅读这两份代码,读者可以更好地理解和掌握Java反射的实践运用。

    HIBERNATE - 符合Java习惯的关系数据库持久化

    2. **访问器方法**:实体类应提供getter和setter方法,以便Hibernate通过反射机制读取和更新属性值。 3. **默认构造器**:实体类需包含无参构造器,以满足序列化和反序列化的需求。 4. **标识符属性**:实体类应有一...

    反射实例-JAVA反射机制.doc

    Java反射机制是Java编程语言中的一个重要特性,它允许...总之,Java反射机制提供了强大的动态编程能力,但它也带来了性能和安全的挑战。因此,使用反射时应谨慎,确保其带来的灵活性和功能增强能够抵消潜在的负面影响。

    hibernate 反射原理

    描述:本文章旨在深入探讨Java与Hibernate框架结合时所涉及的反射原理,通过解析Java反射机制的基础知识,理解Hibernate如何利用反射技术实现对象关系映射(ORM)。 ### Java反射原理概览 Java反射是Java语言的一...

    java反射机制与动态代理

    - **ORM框架**:Hibernate等ORM框架使用反射处理对象和数据库之间的映射关系。 - **动态代理**:使用反射创建代理对象。 #### 二、反射API介绍 Java反射API主要包括以下类: - **Class类**:表示一个类,通过它...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    Java反射机制在数据持久层轻量级ORM框架中的应用研究.zip

    综上所述,Java反射机制在数据持久层轻量级ORM框架中扮演着核心角色,它使得框架能够灵活地处理对象与数据库之间的映射,降低了开发难度,提高了代码的可维护性和可扩展性。然而,虽然反射带来了诸多便利,但也需要...

    Java Reflection (JAVA反射)详解

    - ORM框架:如 Hibernate,通过反射来映射数据库记录到对象。 - AOP(面向切面编程):动态织入代码,如 Spring 框架中的代理模式。 - 动态插件和扩展:在运行时加载和使用未知的类或库。 - 自动化测试:模拟...

    java反射简单例子demo

    2. 数据库持久化框架:如Hibernate,利用反射操作数据库对象的属性,实现ORM(对象关系映射)。 3. 字符串拼接优化:StringBuilder的`append`方法利用反射优化字符串连接性能。 4. 测试工具:如JUnit,反射调用私有...

    JAVA反射机制实例教程

    总结,Java反射机制为程序提供了强大的动态能力,但同时也带来了一定的安全风险和性能影响,因此在使用时需谨慎权衡。通过反射,开发者可以编写更加灵活和通用的代码,处理一些在编译时无法预知的情况。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件  C.1 创建带有@hibernate标记的Java源文件  C.2 建立项目的目录结构  C.3 运行XDoclet工具 附录D 发布和运行netstore应用  D.1 运行...

    Hibernate、Spring和Struts工作原理及使用理由

    - **反射机制**:利用Java反射实现透明性,无需字节码增强。 - **高性能**:轻量级框架,支持多种数据库,适应复杂的数据关系。 **延迟加载(Lazy Loading)**: Hibernate支持实体对象和集合的延迟加载,只有在...

    hibernate 中文参考手册.

    Hibernate 利用Java的反射机制动态地获取和设置对象属性,同时也支持CGLIB和JDK动态代理,实现透明的懒加载和代理对象。 11. 更新和删除策略: Hibernate 提供了多种更新和删除策略,如立即更新、延迟更新、乐观...

    Java的反射demo示例

    - 数据持久化框架:如Hibernate,通过反射将数据库记录映射为Java对象。 - AOP(面向切面编程):Spring框架中的代理模式实现依赖于反射。 - 测试工具:JUnit等测试框架使用反射来调用私有方法进行测试。 通过这个...

    java反射1

    总之,Java反射机制提供了一种强大的工具,允许程序在运行时检查和操作类、对象、方法和属性,极大地增强了Java的灵活性和可扩展性。在实际开发中,反射被广泛应用于各种场景,如框架设计、插件系统、元数据处理等。...

Global site tag (gtag.js) - Google Analytics