?????????? 關于以前寫的hibernate繼承關系映射,當30多張表的時候,系統開銷太大,導致了內存溢出的嚴重問題,沒有辦法,只能換一種繼承策略了。
??????????? 就是30多張表的共用字段都提取出來,在數據庫里建一張表,其他表里只有自身的字段。然后在配置文件里面去繼承共用的那張表就OK了。其間,只是一些配置文件的細節發生了變化。程序代碼一點都不用改變!hibernate真強大啊!說多了沒用,上代碼!哦。。。先說說例子的大概情況:有一張職員表(這張表就是共用字段),一張小時工表(繼承職員表),一張薪水工表(也繼承職員表)。
(1)職員表
????











?












?
(2)小時工表
???????





















???????










?
(3)薪水工表
?





















?????????










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
















?













一會說,接著說。
???? 職位表中的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"都是合適的。 顯式的多態在有兩個不同的類映射到同一個表的時候很有用。(允許一個“輕型”的類,只包含部分表字段)。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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