轉: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
上面的配置文件是抽象的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
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對象,因此只能經過反射機制來實現了.