hibernate繼承關係映射和java反射機制的運用

轉:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感謝博主分享java

Notes:hibernate元數據的運用;uuid的概念;java的反射機制,「由於抽象類沒法new出對象來,因此就要用java反射機制」,「TcommTable tomm = (TcommTable) Class.forName(allName).newInstance();」;app

      

hibernate繼承關係映射大概有5種,這5種繼承關係映射裏面,我以爲最有效最經常使用的一種方式很是好.就說說這種吧.先來講說hibernate繼承關係何時使用.ui

             (1) hibernate繼承關係何時使用?spa

             不少例子都是說一個動物類,而後是老虎類啊,獅子類啊之類去繼承動物類.例子很好,可是實際應用中我根據這個提出了一個徹底可行的解決方案,頗有成就感!.net

             在項目裏面,遇到這樣一個問題,大概有30多張表,裏面都有共性的字段,每張表都須要走審覈流程,若是針對每張表都作相應的審覈模塊,代碼重複不說,那工做量就大了.針對這個就須要用到hibernate繼承關係映射了,全部共性的字段都提取出來,把審覈模塊作成公共的模塊!這中間又涉及用到了java反射機制.hibernate

            (2)開始例子code

            先把30多張表共性的字段整理出來, id主鍵字段(String 類型的 主鍵生成方式是uuid),由於uuid按着計算,聽說得300年才能出現重複的數據,300年之後我早就入古了,軟件維護找我,嘿嘿,連骨灰都沒嘍!得了,跑題了.......繼續!xml

          共有的字段:對象

         id     varchar   32blog

         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對象,因此只能經過反射機制來實現了.

相關文章
相關標籤/搜索