黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

hibernate繼承關(guān)系映射和java反射機(jī)制的運(yùn)用

系統(tǒng) 2219 0

????????????????? hibernate繼承關(guān)系映射大概有5種,這5種繼承關(guān)系映射里面,我覺得最有效最常用的一種方式非常好.就說說這種吧.先來說說hibernate繼承關(guān)系什么時(shí)候使用.

???????????? (1)?hibernate繼承關(guān)系什么時(shí)候使用?

???????????? 很多例子都是說一個(gè)動(dòng)物類,然后是老虎類啊,獅子類啊之類去繼承動(dòng)物類.例子很好,但是實(shí)際應(yīng)用中我根據(jù)這個(gè)提出了一個(gè)完全可行的解決方案,很有成就感!

???????????? 在項(xiàng)目里面,遇到這樣一個(gè)問題,大概有30多張表,里面都有共性的字段,每張表都需要走審核流程,如果針對(duì)每張表都做相應(yīng)的審核模塊,代碼重復(fù)不說,那工作量就大了.針對(duì)這個(gè)就需要用到hibernate繼承關(guān)系映射了,所有共性的字段都提取出來,把審核模塊做成公共的模塊!這中間又涉及用到了java反射機(jī)制.

??????????? (2)開始例子

??????????? 先把30多張表共性的字段整理出來, id主鍵字段(String 類型的 主鍵生成方式是uuid),因?yàn)閡uid按著計(jì)算,據(jù)說得300年才能出現(xiàn)重復(fù)的數(shù)據(jù),300年以后我早就入古了,軟件維護(hù)找我,嘿嘿,連骨灰都沒嘍!得了,跑題了.......繼續(xù)!

????????? 共有的字段:

???????? id???? varchar?? 32

???????? fileName?? varchar? 100

??????? audState??? varchar? 2

??????? tableName? varchar? 50 (這個(gè)字段存表名,表1的名字table1,就存table1,表2的名字table2,就存table2......反射時(shí)候用)

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

???????? isDel?? varchar? 2

??????? fileTypeId?? int????4

??????? code1?? varchar?? 50

??????? code2?? varchar? 50

??????? code3?? varchar? 50

?????????hibenrate繼承關(guān)系映射開始了

??????? 把共有的字段提出來做一個(gè)配置文件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" ?.

要生成相應(yīng)的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)運(yùn)用java的反射機(jī)制實(shí)現(xiàn)模塊的共用性

?????? 當(dāng)30多張表公用一個(gè)審核模塊的時(shí)候,把抽象類TcommTable傳到審核模塊,如何知道這個(gè)抽象類是那張具體的表呢?就用到了java反射機(jī)制了,因?yàn)槌橄箢悷o法new出對(duì)象來,所以就要用java反射機(jī)制.

????? 在審核的action里面實(shí)現(xiàn)java的反射機(jī)制,主要代碼如下:

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

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

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

????這樣,就能得到table1所有的字段(公共字段和table1特有的字段),然后把要審核的內(nèi)容放進(jìn)tomm這個(gè)對(duì)象里面就行了.注意,java反射機(jī)制必須要帶上類的完整包名,否則反射出錯(cuò).tableName字段是區(qū)分30多張表的識(shí)別字段,通過這個(gè)字段,hibernate就自動(dòng)可以判斷出是哪個(gè)表和相應(yīng)的類了,然后通過反射就能得到相應(yīng)類的所有字段了,因?yàn)楣沧侄畏旁谝粋€(gè)抽象類里面,抽象類無法new對(duì)象,所以只能通過反射機(jī)制來實(shí)現(xiàn)了.

?

hibernate繼承關(guān)系映射和java反射機(jī)制的運(yùn)用


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論