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对象,所以只能通过反射机制来实现了.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
该资源包含源代码 易看易懂 其实就是一发射机制 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。 反射本身并不是一个新概念,它可能会使我们联想到光学中的反射概念,尽管计算机科学赋予了反射概念新的含义,但是,从现象上来说,它们确实有某些相通之处,这些有助于我们的理解。在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。可以看出,同一般的反射概念相比,计算机科学领域的反射不单单指反射本身,还包括对反射结果所采取的措施。所有采用反射机制的系统(即反射系统)都希望使系统的实现更开放。可以说,实现了反射机制的系统都具有开放性,但具有开放性的系统并不一定采用了反射机制,开放性是反射系统的必要条件。一般来说,反射系统除了满足开放性条件外还必须满足原因连接(Causally-connected)。所谓原因连接是指对反射系统自描述的改变能够立即反映到系统底层的实际状态和行为上的情况,反之亦然。开放性和原因连接是反射系统的两大基本要素。13700863760 Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值