Hibernate中對(duì)繼承關(guān)系的映射有三種方法:
1、每一個(gè)具體子類(lèi)映射成單個(gè)數(shù)據(jù)庫(kù)表,而抽象基類(lèi)不參與映射。
優(yōu)點(diǎn):數(shù)據(jù)操作實(shí)現(xiàn)簡(jiǎn)單,每個(gè)表中都包含自己所需要的具體子類(lèi)的所有信息,減少了多表關(guān)聯(lián)操作時(shí)的性能消耗。
缺點(diǎn):
類(lèi)的修改會(huì)導(dǎo)致相對(duì)應(yīng)的表及其子類(lèi)所對(duì)應(yīng)表的更改。不支持多態(tài)查詢。
應(yīng)用:
適合在類(lèi)層次結(jié)構(gòu)上有一定數(shù)量的抽象類(lèi)的情況下使用。
2、將整個(gè)類(lèi)層次映射為單個(gè)數(shù)據(jù)庫(kù)表。
這對(duì)于子類(lèi)屬性不多的情況非常有效。每個(gè)子類(lèi)由識(shí)別列(discriminator column)區(qū)分。
優(yōu)點(diǎn):
實(shí)現(xiàn)簡(jiǎn)單,并支持多態(tài)。同時(shí)數(shù)據(jù)訪問(wèn)也比較簡(jiǎn)單,因?yàn)閿?shù)據(jù)庫(kù)表中包含了所有需要的信息。
缺點(diǎn):
增加類(lèi)層次中的耦合,類(lèi)層次中任何類(lèi)的屬性的增加都有會(huì)導(dǎo)致表的變更。另外,對(duì)子類(lèi)屬性的修改錯(cuò)誤將會(huì)影響到整個(gè)類(lèi)的層次結(jié)構(gòu)。當(dāng)然也浪費(fèi)了大量的數(shù)據(jù)庫(kù)空間。表中引入?yún)^(qū)分子類(lèi)的字段,子類(lèi)的字段不能創(chuàng)建為空。
3、繼承關(guān)系中每個(gè)類(lèi)均映射為一個(gè)數(shù)據(jù)庫(kù)表
優(yōu)點(diǎn):
此時(shí),與面向?qū)ο蟮母拍钍且恢碌模@種映射實(shí)現(xiàn)策略的最大好處就是關(guān)系模型完全標(biāo)準(zhǔn)化,關(guān)系模型和領(lǐng)域模型完全一致,易于修改基類(lèi)和增加新的子類(lèi)。
缺點(diǎn):
數(shù)據(jù)庫(kù)中存在大量的表,為細(xì)粒度級(jí)的數(shù)據(jù)模型,訪問(wèn)數(shù)據(jù)時(shí)將存在大量的關(guān)聯(lián)表的操作,效率較低。
詳細(xì)內(nèi)容:
Hibernate繼承映射-具體類(lèi)映射為數(shù)據(jù)庫(kù)表 : http://www.aygfsteel.com/wintys/archive/2009/06/21/hibernate_inheritance_concrete.html
Hibernate繼承映射-整個(gè)類(lèi)層次映射為單個(gè)數(shù)據(jù)庫(kù)表 : http://www.aygfsteel.com/wintys/archive/2009/06/21/hibernate_inheritance_allinone.html
Hibernate繼承映射-繼承關(guān)系中每個(gè)類(lèi)均映射為一個(gè)數(shù)據(jù)庫(kù)表: http://www.aygfsteel.com/wintys/archive/2009/06/21/hibernate_inheritance_separate.html
[附件]:
以上三種繼承映射的源代碼:hibernate_inheritance.zip