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

转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享

Notes:hibernate元数据的运用;uuid的概念;java的反射机制,“因为抽象类无法new出对象来,所以就要用java反射机制”,“TcommTable tomm = (TcommTable) Class.forName(allName).newInstance();”;

      

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

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

时间: 2024-08-08 00:31:36

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

hibernate继承关系映射方法(三)--每个具体类一张表TPC

TPC:所谓是"每个具体类一张表(table per concrete class)"的意思是:使继承体系中每一个子类都对应数据库中的一张表.每一个子类对应的数据库表都包含了父类的信息,并且包含了自己独有的属性.每个子类对应一张表,而且这个表的信息是完备的,即包含了所有从父类继承下来的属性映射的字段.这种策略是使用<union-subclass>标签来定义子类的. 注意:三个类+一个父类映射文件+两张表 student表 worker表 测试工程: Person.java

hibernate继承关系映射关系方法(二)--每个子类一张表

TPS:所谓"每个子类一张表(Table Per Subclass)":父类一张表,每个子类一张表,父类的表保存公共有信息,子类的表只保存自己特有的信息 这种策略是使用<joined-subclass>标签来定义子类的.父类.子类都对应一张数据库表.在父类对应的数据库表中,它存储了所 有记录的公共信息,实际上该父类对应的表会包含所有的记录,包括父类和子类的记录:在子类对应的数据库表中,这个表只定义了子类中所特有的属性映射的字 段. person表 student表 work

【java基础】Java反射机制

一.预先需要掌握的知识(java虚拟机)  1)java虚拟机的方法区:  java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区.方法区的主要作用是存储被装载的类 的类型信息,当java虚拟机装载某个类型的时候,需要类装载器定位相应的class文件,然后将其读入到java虚拟机中,紧接着虚拟机提取class 中的类型信息,将这些信息存储到方法区中.这些信息主要包括: 这个类型的全限定名 这个类型的直接超类的全限定名 这个类型是类类型还是接口类型

Java反射机制知识点

反射机制 本文章参照:魔乐java视频教程讲解,感谢 1.认识反射 反射之中包含一个"反"的概念,所以就必须先从"正"开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是"反"指的是通过对象找到类 package cn.test; class Person{};   // 定义一个Person类 public class ReflectDemo { public static void main(Str

什么是Java反射机制,有什么作用

什么是Java反射机制? Java反射机制是 Java 语言的一个重要特性,它在服务器程序和中间件程序中得到了广泛运用.在服务器端,往往需要根据客户的请求,动态调用某一个对象的特定方法.此外,在 ORM 中间件的实现中,运用 Java 反射机制可以读取任意一个 JavaBean 的所有属性,或者给这些属性赋值 通过反射机制,可以在运行的时候访问到对象的属性.方法.构造方法等等 哪些地方用到反射机制? 其实我们都用过反射机制,只是并不知道它是反射机制而已.比如我们使用JDBC连接数据库的时候(Cl

Java 反射机制(包括组成、结构、示例说明等内容)

http://www.cnblogs.com/skywang12345/p/3345205.html 第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据"类的部分已经的信息"来还原"类的全部的信息".这里"类的部分已经的信息",可以是"类名"或"类的对象"等信息."类的全部信息"就是指"类的属性,方法,继承关系和Annotation

java基础知识(十一)java反射机制(下)

1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. 也就是说,java程序可以加载一个运行时才得知名称的class,获悉该类的完整构造(但不包括methods定义),并生成其对象实体,或对其fields设值,或唤起其methods.总之,就是JVM可以在运行时加载.探知.使用编译期完全未知的classes. 2.jdk提供的反射api Java反射相

hibernate 对象关系映射文件详解

POJO 类和数据库的映射文件*.hbm.xml POJO类和关系数据库之间的映射可以用一个XML文档来定义. 映射文件的扩展名为.hbm.xml 在运行时Hibernate将根据这个映射文件来生成各种SQL语句 通过POJO类的数据库映射文件,Hibernate可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对应关系 映射文件说明 hibernate-mapping 类层次:class 主键:id 基本类型:property 实体引用类: many-to-one

java反射机制(转)

一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制         有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,     Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成     驱动对象实例