亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

hibernate繼承映射2

系統 2132 0

?????????? 關于以前寫的hibernate繼承關系映射,當30多張表的時候,系統開銷太大,導致了內存溢出的嚴重問題,沒有辦法,只能換一種繼承策略了。

??????????? 就是30多張表的共用字段都提取出來,在數據庫里建一張表,其他表里只有自身的字段。然后在配置文件里面去繼承共用的那張表就OK了。其間,只是一些配置文件的細節發生了變化。程序代碼一點都不用改變!hibernate真強大啊!說多了沒用,上代碼!哦。。。先說說例子的大概情況:有一張職員表(這張表就是共用字段),一張小時工表(繼承職員表),一張薪水工表(也繼承職員表)。

(1)職員表

????

package ?mypack;

import ?java.io.Serializable;

public ? abstract ? class ?Employee? implements ?Serializable? ... {

????
private ?Long?id;
????
private ?String?name;
??????? private String type;
???
????生成get、set方法
}

?

<? xml?version="1.0" ?>
<! DOCTYPE?hibernate-mapping
PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
< hibernate-mapping? >
???
< class? name ="mypack.Employee" ?table ="EMPLOYEES" ?polymorphism ="implicit" > ?
??????
< id? name ="id" ?type ="long" ?column ="ID" >
????????
< generator? class ="native" />
??????
</ id > ??
??????
< property? name ="name" ?type ="string" ?column ="NAME" ? />
???????? < property? name ="type" ?type ="string" ?column ="type" ?length="50" />
????
</ class >
</ hibernate-mapping >

?

(2)小時工表

???????

package ?mypack;

import ?java.io.Serializable;

public ? class ?HourlyEmployee? extends ?Employee ... {

????
private ? double ?rate;

???
/**?*/ /** ?default?constructor? */
????
public ?HourlyEmployee()? ... {
????}


????
public ? double ?getRate()? ... {
????????
return ? this .rate;
????}


????
public ? void ?setRate( double ?rate)? ... {
????????
this .rate? = ?rate;
????}


}

???????

<? xml?version="1.0" ?>
<! DOCTYPE?hibernate-mapping
PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
< hibernate-mapping? >
??????
< joined-subclass? name ="mypack.HourlyEmployee" ?table ="HOURLY_EMPLOYEES" ??extends ="mypack.Employee" ? >
?????????
< key? column ="EMPLOYEE_ID" ? />
?????????
< property? name ="rate" ?column ="RATE" ?type ="double" ? />
??????
</ joined-subclass >
</ hibernate-mapping >

?

(3)薪水工表

?

package ?mypack;

import ?java.io.Serializable;

public ? class ?SalariedEmployee? extends ?Employee? ... {

????
private ? double ?salary;

????
/**?*/ /** ?default?constructor? */
????
public ?SalariedEmployee()? ... {
????}


???
public ? double ?getSalary()? ... {
????????
return ? this .salary;
????}


????
public ? void ?setSalary( double ?salary)? ... {
????????
this .salary? = ?salary;
????}


}

?????????

<? xml?version="1.0" ?>
<! DOCTYPE?hibernate-mapping
PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
< hibernate-mapping? >
??????
< joined-subclass? name ="mypack.SalariedEmployee" ??table ="SALARIED_EMPLOYEES" ?extends ="mypack.Employee" ? >
?????????
< key? column ="EMPLOYEE_ID" ? />
?????????
< property? name ="salary" ?column ="SALARY" ?type ="double" ? />
??????
</ joined-subclass >
</ hibernate-mapping >

?

最后一步:注意了!把職員表重新命名再映射一遍,這回不是抽象的了。

package ?mypack;

import ?java.io.Serializable;

public ? class ?jEmployee? implements ?Serializable? ... {

????
private ?Long?id;
????
private ?String?name;
????
private ?String?type;
?
????
/**?*/ /** ?default?constructor? */
????
public ?jEmployee()? ... {
????}

???
????
// 生成get,set方法
}

?

<? xml?version="1.0" ?>
<! DOCTYPE?hibernate-mapping
PUBLIC?"-//Hibernate/Hibernate?Mapping?DTD?2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"
>
< hibernate-mapping? >
???
< class? name ="mypack.jEmployee" ?table ="EMPLOYEES" ? >
??????
< id? name ="id" ?type ="long" ?column ="ID" >
????????
< generator? class ="native" />
??????
</ id > ??
??????
< property? name ="name" ?type ="string" ?column ="NAME" ? />
??????
< property? name ="type" ?type ="string" ?column ="type" ??length ="50" />
????
</ class >
</ hibernate-mapping >

一會說,接著說。

???? 職位表中的type字段記錄著每個子表的表名。

??? 上面2,3的配置文件采用 joined-subclass,hiberntae中的繼承有3中,還有兩種,一個是 union-subclass和subclass。用union-subclass生成的sql語句都是以union形式的,用join-subclass生成的sql語句都是什么什么join。subclass這個方式太簡單了,不說了。

?? 為什么把職位表映射兩遍呢?而且最后一遍的映射是沒有繼承關系的單一文件,而且也不是抽象的。因為hibernate繼承映射的話,它會查出它子類的所有的東西,hibernate3.0是這樣的。假如說我程序里面想把所有共性的字段以列表的形式查出來,那么hibernate就會把它的子類都查出來,這樣開銷太大了。所以把員工表單獨映射一個純凈的類來解決這個開銷問題。

? 關于(1)中的配置文件中的polymorphism="implicit"屬性,有兩個值,即: implicit ( 隱式 )和 explicit(顯式)兩種。默認是 implicit。很多人說,把這個屬性值設一下,這樣按著父類查詢是就不會把子類查出來,這是不對的,這種說法并沒有理解隱式和顯式的真正含義。他們的區別如下:

??? implicit(隱式)形式不使用join關鍵字。關聯使用"點號"來進行“引用”。implicit join可以在任何HQL子句中出現.implicit join在最終的SQL語句中以inner join的方式出現。

from Cat as cat where cat.mate.name like '%s%'

Implicit (隱式)的多態是指,如果查詢中給出的是任何超類、該類實現的接口或者該類的名字,都會返回這個類的實例;如果查詢中給出的是子類的名字,則會返回子類的實例。 Explicit (顯式)的多態是指,只有在查詢中給出的明確是該類的名字時才會返回這個類的實例;同時只有當在這個<class>的定義中作為<subclass>或者<joined-subclass>出現的子類,才會可能返回。 大多數情況下,默認的polymorphism="implicit"都是合適的。 顯式的多態在有兩個不同的類映射到同一個表的時候很有用。(允許一個“輕型”的類,只包含部分表字段)。

hibernate繼承映射2


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久新网址| 国产午夜精品久久理论片 | 久久久久久青草大香综合精品 | 国产a级高清版毛片 | 福利影院第一页 | 精品国产高清自在线一区二区三区 | 亚洲视频在线观看 | 亚洲国产精品第一区二区 | 免费视频一区二区三区四区 | 爱视频福利网 | 岛国精品在线观看 | 伊人免费视频 | 国产亚洲欧美日韩综合综合二区 | 日一日操一操 | www.欧美视频| 久久婷婷色综合老司机 | 91香蕉黄| 九九夜夜 | 亚洲精品入口一区二区在线观看 | 国内精品久久久久激情影院 | 国产这里只有精品 | 四虎欧美在线观看免费 | 中国第一毛片 | 一级特黄aaa大片免色 | 韩国女主播一区二区三区视频 | 中文精品99久久国产 | 久久精品免费观看久久 | 日本欧美黄色 | 日韩精品免费一区二区三区 | 国产牛牛 | 亚洲人成毛片线播放 | 色 综合 欧美 亚洲 国产 | 欧美专区亚洲专区 | 成人a网 | 性欧美视频 | 91亚洲精品国产自在现线 | 国产成人18黄网站麻豆 | 欧美成人午夜精品一区二区 | 国产综合在线观看 | 日本香蕉视频 | 四虎影视库永久在线地址 |