單表繼承映射
每棵類(lèi)繼承樹(shù)使用一個(gè)表。


映射文件Extends.hbm.xml。
<hibernate-mapping package="com.snail.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="Brid" discriminator-value="B">
<property name="height"/>
</subclass>
</class>
</hibernate-mapping>
因?yàn)轭?lèi)繼承樹(shù)肯定是對(duì)應(yīng)多個(gè)類(lèi),要把多個(gè)類(lèi)的信息存放在一張表中,必須有某種機(jī)制來(lái)區(qū)分哪些記錄是屬于哪個(gè)類(lèi)的。這種機(jī)制就是,在表中添加一個(gè)字段,用這個(gè)字段的值來(lái)進(jìn)行區(qū)分。用hibernate實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:
(一)父類(lèi)用普通的<class>標(biāo)簽定義
(二)在父類(lèi)中定義一個(gè)discriminator,即指定這個(gè)區(qū)分的字段的名稱和類(lèi)型
如:<discriminator column=”XXX” type=”string”/>
(三)子類(lèi)使用<subclass>標(biāo)簽定義,在定義subclass的時(shí)候,需要注意如下幾點(diǎn):
1.Subclass標(biāo)簽的name屬性是子類(lèi)的全路徑名;
2.在Subclass標(biāo)簽中,用discriminator-value屬性來(lái)標(biāo)明本子類(lèi)的discriminator字段(用來(lái)區(qū)分不同類(lèi)的字段)的值;
3.Subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類(lèi)之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在subclass標(biāo)簽中,添加extends屬性,里面的值是父類(lèi)的全路徑名稱。
4.子類(lèi)的其它屬性,像普通類(lèi)一樣,定義在subclass標(biāo)簽的內(nèi)部。
具體表繼承映射
每個(gè)具體類(lèi)一張表。(同上例)

映射文件Extends.hbm.xml。
<hibernate-mapping package="com.snail.hibernate">
<class name="Animal" table="t_animal" lazy="false" abstract="true">
<id name="id">
<generator class="assigned"/>
</id>
<property name="name"/>
<property name="sex"/>
<union-subclass name="Pig" table="t_pig">
<property name="weight"/>
</union-subclass>
<union-subclass name="Brid" table="t_brid">
<property name="height"/>
</union-subclass>
</class>
</hibernate-mapping>
這種策略是使用union-subclass標(biāo)簽來(lái)定義子類(lèi)的。每個(gè)子類(lèi)對(duì)應(yīng)一張表,而且這個(gè)表的信息是完備的,即包含了所有從父類(lèi)繼承下來(lái)的屬性映射的字段(這就是它跟joined-subclass的不同之處,joined-subclass定義的子類(lèi)的表,只包含子類(lèi)特有屬性映射的字段)。實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:
(一)父類(lèi)用普通<class>標(biāo)簽定義即可;
(二)子類(lèi)用<union-subclass>標(biāo)簽定義,在定義union-subclass的時(shí)候,需要注意如下幾點(diǎn):
1.Union-subclass標(biāo)簽不再需要包含key標(biāo)簽(與joined-subclass不同)。
2.Union-subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類(lèi)之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)Union-subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在Union-subclass標(biāo)簽中,添加extends屬性,里面的值是父類(lèi)的全路徑名稱。
3.子類(lèi)的其它屬性,像普通類(lèi)一樣,定義在Union-subclass標(biāo)簽的內(nèi)部。這個(gè)時(shí)候,雖然在union-subclass里面定義的只有子類(lèi)的屬性,但是因?yàn)樗^承了父類(lèi),所以,不需要定義其它的屬性,在映射到數(shù)據(jù)庫(kù)表的時(shí)候,依然包含了父類(lèi)的所有屬性的映射字段。
注意:在保存對(duì)象的時(shí)候id不能重復(fù)(不能使用數(shù)據(jù)庫(kù)的自增方式生成主鍵)
類(lèi)表繼承映射
每個(gè)類(lèi)一張表。(同上例)

映射文件Extends.hbm.xml。
- <hibernate-mapping package="com.snail.hibernate">
- <class name="Animal" table="t_animal" lazy="false">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <property name="sex"/>
- <joined-subclass name="Pig" table="t_pig">
- <key column="pid"/>
- <property name="weight"/>
- </joined-subclass>
- <joined-subclass name="Brid" table="t_brid">
- <key column="bid"/>
- <property name="height"/>
- </joined-subclass>
- </class>
- </hibernate-mapping>
這種策略是使用joined-subclass標(biāo)簽來(lái)定義子類(lèi)的。父類(lèi)、子類(lèi),每個(gè)類(lèi)都對(duì)應(yīng)一張數(shù)據(jù)庫(kù)表。在父類(lèi)對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,實(shí)際上會(huì)存儲(chǔ)所有的記錄,包括父類(lèi)和子類(lèi)的記錄;在子類(lèi)對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,這個(gè)表只定義了子類(lèi)中所特有的屬性映射的字段。子類(lèi)與父類(lèi),通過(guò)相同的主鍵值來(lái)關(guān)聯(lián)。實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:
(一)父類(lèi)用普通的<class>標(biāo)簽定義即可,父類(lèi)不再需要定義discriminator字段;
(二)子類(lèi)用<joined-subclass>標(biāo)簽定義,在定義joined-subclass的時(shí)候,需要注意如下幾點(diǎn):
1.Joined-subclass標(biāo)簽的name屬性是子類(lèi)的全路徑名
2.Joined-subclass標(biāo)簽需要包含一個(gè)key標(biāo)簽,這個(gè)標(biāo)簽指定了子類(lèi)和父類(lèi)之間是通過(guò)哪個(gè)字段來(lái)關(guān)聯(lián)的。
如:<key column=”PARENT_KEY_ID”/>,這里的column,實(shí)際上就是父類(lèi)的主鍵對(duì)應(yīng)的映射字段名稱。
3.Joined-subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類(lèi)之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)Joined-subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在Joined-subclass標(biāo)簽中,添加extends屬性,里面的值是父類(lèi)的全路徑名稱。
4.子類(lèi)的其它屬性,像普通類(lèi)一樣,定義在joined-subclass標(biāo)簽的內(nèi)部。
posted on 2012-07-16 22:16
zhanghu198901 閱讀(998)
評(píng)論(0) 編輯 收藏