開(kāi)篇前言
在前面的博文中,小編介紹了hibernate中的映照,1對(duì)1,1對(duì)多,多對(duì)多,單向,雙向等,今天這篇博文,小編主要來(lái)介紹1下hibernate中的繼承映照,小火伴都知道在C#中,如果想要實(shí)現(xiàn)繼承,直接在子類(lèi)中添加冒號(hào)便可繼承父類(lèi),在java中可以用關(guān)鍵字extends實(shí)現(xiàn),那末在hibernate中,甚么是繼承映照呢?繼承映照的方式又是甚么?繼承映照具有幾種策略呢?不同策略之間又存在著怎樣樣的區(qū)分和聯(lián)系呢?該博文,小編就來(lái)簡(jiǎn)單的總結(jié)1下hibernate中的繼承映照。
繼承映照是甚么首先,我們來(lái)看這樣的1張表結(jié)構(gòu):
上述的表結(jié)構(gòu)就是繼承映照的1種,小豬豬和小鳥(niǎo)鳥(niǎo)他們共用了字段Name和Sex,除此以外,有些字段是針對(duì)某種數(shù)據(jù)而存在的,所以在數(shù)據(jù)庫(kù)中為空,如上所,weight是針對(duì)小豬豬而言的,而height是針對(duì)小鳥(niǎo)鳥(niǎo)而言的,從上面的表結(jié)構(gòu),我們可以得出,有些字段是共用的,有些字段是自己獨(dú)有的,她們通過(guò)type這個(gè)字段來(lái)進(jìn)行區(qū)分,ok,小編相信,小火伴們現(xiàn)在對(duì)繼承映照已有了1定的了解,接著小編來(lái)介紹繼承映照的方式。
繼承映照方式
在前面的博文中,小編提到過(guò),c#和java中的繼承,但是在數(shù)據(jù)庫(kù)的世界中,表之間是沒(méi)有任何關(guān)鍵字可以明確指明這兩張表的父子關(guān)系,表與表是沒(méi)有繼承關(guān)系這樣的說(shuō)法的。為了將程序領(lǐng)域中的繼承關(guān)系反應(yīng)到數(shù)據(jù)中,Hibernate為我們提供了3種策略,分別是:
a、每顆類(lèi)繼承樹(shù)1張表;
b、每一個(gè)類(lèi)1張表;
c、每一個(gè)具體類(lèi)1張表;
我們?nèi)匀粡膗ml入手,看對(duì)象模型,以下所示:
Pig和Bird都繼承Animal,她們都有id,name,sex,但是Pig主要看weight,而B(niǎo)ird主要看height,此時(shí)如果把這些數(shù)據(jù)存入到數(shù)據(jù)庫(kù)中,可以有3種方案,也就是3種策略。ok,接下來(lái)結(jié)合Animal這個(gè)例子,分別對(duì)3種策略進(jìn)行講授。
第1種、每顆類(lèi)繼承樹(shù)1張表
這類(lèi)方式,只生成1個(gè)table,對(duì)應(yīng)的繼承映照策略是“單表繼承”。如圖:
每顆類(lèi)繼承樹(shù)1張表,也就是使用1張表表示所有繼承體系下的類(lèi)的屬性的并集,這類(lèi)策略是使用<subclass>標(biāo)簽來(lái)實(shí)現(xiàn)的。由于類(lèi)繼承體系下會(huì)有許多個(gè)子類(lèi),要把多個(gè)類(lèi)的信息寄存在1張表中,必須有某種機(jī)制來(lái)辨別哪些記錄是屬于哪一個(gè)類(lèi)的。Hibernate中的這類(lèi)機(jī)制就是,在表中添加1個(gè)字段,用這個(gè)字段的值來(lái)進(jìn)行辨別。在表中添加這個(gè)標(biāo)示列使用<discriminator>標(biāo)簽來(lái)實(shí)現(xiàn),hbm.xml文件以下所示:
這類(lèi)方式,每一個(gè)類(lèi)生成1個(gè)table,對(duì)應(yīng)的繼承策略是“類(lèi)表繼承”。如圖:
這類(lèi)策略是使用<joined-subclass>標(biāo)簽來(lái)定義子類(lèi)的。父類(lèi)、子類(lèi)都對(duì)應(yīng)1張數(shù)據(jù)庫(kù)表。在父類(lèi)對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,它存儲(chǔ)了所有記錄的公共信息,實(shí)際上該父類(lèi)對(duì)應(yīng)的表會(huì)包括所有的記錄,包括父類(lèi)和子類(lèi)的記錄;在子類(lèi)對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,這個(gè)表只定義了子類(lèi)中所獨(dú)有的屬性映照的字段。子類(lèi)對(duì)應(yīng)的數(shù)據(jù)表與父類(lèi)對(duì)應(yīng)的數(shù)據(jù)表,通過(guò)1對(duì)1主鍵關(guān)聯(lián)的方式關(guān)聯(lián)起來(lái)。Hbm.xml文件以下所示: