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

hibernate繼承映射2

系統 2531 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條評論
主站蜘蛛池模板: 在线成人欧美 | 免费福利视频网站 | 在线观看深夜视频 | 国产香蕉网 | 91视频精品 | 激情九月天 | 国产一级特黄高清免费大片 | 日本高清视频不卡 | 免费深夜视频 | 日本一级高清不卡视频在线 | 亚州综合激情另类久久久 | 久久精彩| 亚洲精品高清国产一久久 | 男人深夜影院 | 97视频网站 | 亚洲国产成人成上人色 | 99综合| 免费视频一区 | 奇米影视777中文久久爱 | 老头与老头同性tube可播放 | 中文字幕亚洲专区 | 高h粗大强行撑开紧窄的嫩缝 | 激情五月综合婷婷 | 精品一区二区三区免费毛片爱 | 97久久免费视频 | 福利院肉动漫视频在线观看 | 成人永久免费高清 | 国产人成午夜免视频网站 | 999国产视频 | 久久久久中文字幕 | 国产成人精品综合久久久软件 | 奇米最新视频 | 久久婷婷色| 亚洲欧美另类视频 | 久久99亚洲精品久久久久99 | 天天操夜夜操天天操 | 成人免费黄网站 | 88国产精品欧美一区二区三区 | 在线精品免费视频 | 亚洲骚片| 狠狠久久综合 |