原來(lái)我們都是先設(shè)計(jì)http://www.vxbq.cn/db/在進(jìn)行代碼編寫。也就是說(shuō)都是先有http://www.vxbq.cn/db/,才有實(shí)體對(duì)象。但是這類開(kāi)發(fā)思想其實(shí)不符合我們的面向?qū)ο笏枷搿I趺词敲嫦驅(qū)ο笏枷耄棵嫦驅(qū)ο笫?種對(duì)現(xiàn)實(shí)世界了解和抽象的方法。通過(guò)面向?qū)ο蠓绞剑瑢F(xiàn)實(shí)世界的事物抽象成對(duì)象,現(xiàn)實(shí)世界中的關(guān)系抽象成類、繼承。
但是在關(guān)系型http://www.vxbq.cn/db/中的表與表之間的關(guān)系,并沒(méi)有繼承關(guān)系,不能說(shuō)1張表繼承另外一張表,它們之間的關(guān)系只能是關(guān)聯(lián),那末如何將這類繼承關(guān)系的表映照到我們的http://www.vxbq.cn/db/當(dāng)中呢?Hibernate提供了3種基本實(shí)現(xiàn)策略。
例如:有以下表繼承結(jié)構(gòu)體系:
1、 每棵類繼承樹(shù)基樹(shù)1張表
該種方案,是將不同的種類動(dòng)物都放在同1張表。請(qǐng)看下面的繼承體系結(jié)構(gòu):
由于類繼承樹(shù)肯定是對(duì)應(yīng)多個(gè)類,要把多個(gè)類的信息寄存在1張表中,必須有某種機(jī)制來(lái)辨別哪些記錄是屬于哪一個(gè)類的。這類機(jī)制就是,在表中添加1個(gè)字段,用這個(gè)字段的值來(lái)進(jìn)行辨別。
注意:父類用普通的<class>標(biāo)簽定義 ,在父類中定義1個(gè)discriminator,指定這個(gè)辨別字段的名稱和類型。子類用<subclass>標(biāo)簽定義,其中name屬性是子類的全路徑名。
配置文件實(shí)現(xiàn):
除非將父類定義成抽象的,否則父類也是1張表
這類策略使用joined-subclass 標(biāo)簽來(lái)定義子類的 。父類、子類、每一個(gè)類都對(duì)應(yīng)1張http://www.vxbq.cn/db/表。在父類對(duì)應(yīng)的http://www.vxbq.cn/db/表中,實(shí)際上會(huì)存儲(chǔ)所有的記錄,包括父類和子類的記錄;在子類對(duì)應(yīng)的http://www.vxbq.cn/db/表中,這個(gè)表只定義了子類中所獨(dú)有的屬性映照的字段。子類與父類,通過(guò)相同的主鍵值來(lái)關(guān)聯(lián)。
注意:
1.父類不再需要定義discriminator字段;
2.子類用<joined-subclass>標(biāo)簽定義,其中name屬性是子類的全路徑名,需要包括1個(gè)key標(biāo)簽,用來(lái)指定子類和父類之間是通過(guò)哪一個(gè)字段來(lái)關(guān)聯(lián)的。
3.Joined-subclass 標(biāo)簽,既可以被class標(biāo)簽所包括(表名了類之間的繼承關(guān)系),也能夠與class標(biāo)簽所平行。當(dāng)joined-subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在joined-subclass標(biāo)簽中,添加extends屬性,里面的值是父類的全路徑名。
4.子類的其他屬性,像普通類1樣,定義在joined-subclass標(biāo)簽的內(nèi)部。
配置文件:
3、每一個(gè)具體子類1張表
這類策略是使用union-subclass標(biāo)簽來(lái)定義子類的。每一個(gè)子類對(duì)應(yīng)1張表,而且這個(gè)表的信息是完備的,即包括了所有從父類繼承下來(lái)的屬性映照字段。(joined-subclass定義的子類的表,只包括子類特有屬性映照字段)。
注意:
1. Union-subclass 標(biāo)簽不再需要包括key標(biāo)簽
2. Union-subclass標(biāo)簽,既可以被class標(biāo)簽所包括(這類包括關(guān)系正是表明子類間的繼承關(guān)系),也能夠與class標(biāo)簽平行。當(dāng)union-subclass標(biāo)簽的 定義域class標(biāo)簽平行的時(shí)候,需要在union-subclass標(biāo)簽中,添加extends屬性,里面的值是父類的全路徑名稱。
3. 子類的其他屬性,像普通類1樣,定義在union-subclass標(biāo)簽的內(nèi)部。
配置文件:
總結(jié):
Hibernate提供的這3種策略都可以實(shí)現(xiàn)表的繼承映照。在實(shí)際開(kāi)發(fā)中具體使用何種策略,還需要我們進(jìn)行權(quán)衡。例如策略1:效力好,就1張表,但是當(dāng)表的數(shù)量增多時(shí),會(huì)存在大量的冗余字段。策略2:層次清楚,沒(méi)有冗余。但是類的繼承層次越深,關(guān)聯(lián)的表越多。策略3:不能使用自增方案,由于自增,就有可能出現(xiàn)重復(fù)的主鍵,Hibernate的對(duì)象都是通過(guò)session來(lái)管理的,所以主鍵不能重復(fù)。
上一篇 水平三欄式布局