【SSH系列】Hibernate映射 -- 繼承映射
來源:程序員人生 發布時間:2016-07-21 09:10:21 閱讀次數:3607次
開篇前言
在前面的博文中,小編介紹了hibernate中的映照,1對1,1對多,多對多,單向,雙向等,今天這篇博文,小編主要來介紹1下hibernate中的繼承映照,小火伴都知道在C#中,如果想要實現繼承,直接在子類中添加冒號便可繼承父類,在java中可以用關鍵字extends實現,那末在hibernate中,甚么是繼承映照呢?繼承映照的方式又是甚么?繼承映照具有幾種策略呢?不同策略之間又存在著怎樣樣的區分和聯系呢?該博文,小編就來簡單的總結1下hibernate中的繼承映照。
繼承映照是甚么
首先,我們來看這樣的1張表結構:
上述的表結構就是繼承映照的1種,小豬豬和小鳥鳥他們共用了字段Name和Sex,除此以外,有些字段是針對某種數據而存在的,所以在數據庫中為空,如上所,weight是針對小豬豬而言的,而height是針對小鳥鳥而言的,從上面的表結構,我們可以得出,有些字段是共用的,有些字段是自己獨有的,她們通過type這個字段來進行區分,ok,小編相信,小火伴們現在對繼承映照已有了1定的了解,接著小編來介紹繼承映照的方式。
繼承映照方式
在前面的博文中,小編提到過,c#和java中的繼承,但是在數據庫的世界中,表之間是沒有任何關鍵字可以明確指明這兩張表的父子關系,表與表是沒有繼承關系這樣的說法的。為了將程序領域中的繼承關系反應到數據中,Hibernate為我們提供了3種策略,分別是:
a、每顆類繼承樹1張表;
b、每一個類1張表;
c、每一個具體類1張表;
我們仍然從uml入手,看對象模型,以下所示:

Pig和Bird都繼承Animal,她們都有id,name,sex,但是Pig主要看weight,而Bird主要看height,此時如果把這些數據存入到數據庫中,可以有3種方案,也就是3種策略。ok,接下來結合Animal這個例子,分別對3種策略進行講授。
第1種、每顆類繼承樹1張表
這類方式,只生成1個table,對應的繼承映照策略是“單表繼承”。如圖:

每顆類繼承樹1張表,也就是使用1張表表示所有繼承體系下的類的屬性的并集,這類策略是使用<subclass>標簽來實現的。由于類繼承體系下會有許多個子類,要把多個類的信息寄存在1張表中,必須有某種機制來辨別哪些記錄是屬于哪一個類的。Hibernate中的這類機制就是,在表中添加1個字段,用這個字段的值來進行辨別。在表中添加這個標示列使用<discriminator>標簽來實現,hbm.xml文件以下所示:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping⑶.0.dtd">
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table="t_animal" lazy="false">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="string"/>
<property name="name"/>
<property name="sex"/>
<subclass name="Pig" discriminator-value="P">
<property name="weight"/>
</subclass>
<subclass name="Bird" discriminator-value="B">
<property name="height"/>
</subclass>
</class>
</hibernate-mapping>
第2種、每一個類1張表 這類方式,每一個類生成1個table,對應的繼承策略是“類表繼承”。如圖:

這類策略是使用<joined-subclass>標簽來定義子類的。父類、子類都對應1張數據庫表。在父類對應的數據庫表中,它存儲了所有記錄的公共信息,實際上該父類對應的表會包括所有的記錄,包括父類和子類的記錄;在子類對應的數據庫表中,這個表只定義了子類中所獨有的屬性映照的字段。子類對應的數據表與父類對應的數據表,通過1對1主鍵關聯的方式關聯起來。Hbm.xml文件以下所示:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping⑶.0.dtd">
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<properties name="sex"/>
<joined-subclass name="Pig" table="t_pig">
<key column ="pid"/>
<property name="weight"/>
</joined-subclass>
<joined-subclass name="Bird" table="t_bird">
<key column = "bird"/>
<property name="height"/>
</joined-subclass>
</class>
</hibernate-mapping>
第3種、每一個具體類1張表
這類方式,生成3張表,對應的策略是“具體表繼承”,以下圖所示:
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈