傳智播客-jpa與hibernate(3)-繼承映射 收藏Hibernate支持三種基本的繼承映射策略:每個(gè)類(lèi)分層結(jié)構(gòu)一張表(table per class hierarchy),,每個(gè)子類(lèi)一張表(table per subclass),,每個(gè)具體類(lèi)一張表(table per concrete class),,此外,Hibernate還支持第四種稍有不同的多態(tài)映射策略--隱式多態(tài)(implicit polymorphism) ,。這里只介紹前三種,,最后一種請(qǐng)參閱相關(guān)文檔。代碼示例為注解方式,,配置方式請(qǐng)參閱文檔,。 每個(gè)類(lèi)分層結(jié)構(gòu)一張表(table per class hierarchy) 舉例來(lái)說(shuō),,有父類(lèi)Employee(雇員),,子類(lèi)HE(鐘點(diǎn)工),同級(jí)子類(lèi)SE(正式員工),;HE和SE的區(qū)別在于薪資,,HE以時(shí)效計(jì),字段為rate,,SE以月薪計(jì),,字段為salary;還有一個(gè)字段etype作為具體類(lèi)別信息的區(qū)分標(biāo)識(shí),。 很明顯,,rate和salary是互斥的。所以這兩個(gè)字段應(yīng)當(dāng)允許為空,,而且實(shí)際操作的時(shí)候必然會(huì)有一個(gè)字段列的冗余,。etype對(duì)于每個(gè)類(lèi)別信息自身而言,也可以視為是一個(gè)冗余字段,。所以這個(gè)策略一般在父類(lèi)的屬性字段占總字段的權(quán)重大的時(shí)候較為適用。 @Entity @Entity NOTE: 查詢(xún)的時(shí)候不是用entityManager.find(XXX.class, serialable),??梢杂胑ntityManager.createQuery("select he from HE he").getResultList(),打印的sql語(yǔ)句是:select ... from jpa_inherit_single_ess where etype = 'he',。 每個(gè)子類(lèi)一張表(table per subclass) 還是上述例子,父類(lèi)Employee(雇員),,子類(lèi)HE(鐘點(diǎn)工),,同級(jí)子類(lèi)SE(正式員工)在這個(gè)策略里需要三張對(duì)應(yīng)的表,父類(lèi)表主鍵字段假定為id,,HE和SE表使用同名主鍵,,并與父類(lèi)表主鍵id關(guān)聯(lián),。
@Entity(name="HEJoined") @Entity(name="SEJoined") NOTE:因?yàn)閔es∈ess,所以select he時(shí)打印的sql語(yǔ)句只有一次inner join,,而hes∪ses=ees,,select ees時(shí)印的sql語(yǔ)句有兩次lefte outer join。 有時(shí)候通過(guò)一個(gè)(技術(shù)上或業(yè)務(wù)上)父類(lèi)共享一些公共屬性是很有用的,,同時(shí)還不用將該父類(lèi)作為映射的實(shí)體(也就是該實(shí)體沒(méi)有對(duì)應(yīng)的表),。這個(gè)時(shí)候就需 要使用@MappedSuperclass注解來(lái)進(jìn)行映射。(下文略,,請(qǐng)參見(jiàn)滿江紅翻譯的官方文檔 hibernate_annotations.pdf-->2.2.4.4從父類(lèi)繼承的屬性) 每個(gè)具體類(lèi)一張表(table per concrete class) 示例代碼: @Entity(name="HEUnion") @Entity(name="SEUnion") 下面的內(nèi)容引自《深入淺出Hibernate》6.5.6類(lèi)繼承樹(shù),,有助于更好地理解hibernate的繼承映射,。 (圖片以后再傳) 假設(shè)我們的程序處理是倉(cāng)庫(kù)保管部分,只需要在一個(gè)表中做一個(gè)type字段來(lái)分出“槍支”,,“火箭筒”,,“單兵對(duì)空導(dǎo)彈”(作者難道是國(guó)防科大出 身?,?,?)這3種類(lèi)型,分別放在不同的倉(cāng)庫(kù)位置,。左邊的POJO繼承樹(shù)中,,則為了表明保養(yǎng)等級(jí)的不同,可能會(huì)出現(xiàn)中間的抽象類(lèi)層,,比如說(shuō)有制導(dǎo)武器需要定 期對(duì)制導(dǎo)頭進(jìn)行測(cè)試檢查及保養(yǎng),,而這完全可以不出現(xiàn)在持久化類(lèi)繼承樹(shù)中。持久化策略的實(shí)現(xiàn)是非常靈活自由的。(和上文的 @MappedSuperclass有關(guān)聯(lián)么,?,?) |
|