HIbernate繼承映射

        Hibernate 是一個對象關係映射和持久性框架,它提供了許多高級特性,從內省到多態和繼承映射。這裏講介紹三個策略,在日常的編程之中您可以用它們把複雜的對象模型容易地映射到關係數據庫模型。

繼承映射

(1)單表繼承即是每棵類繼承樹使用一個表。如下圖:


Animal.hbm.xml中的文件代碼:

<class name="com.lsh.hibernate.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="com.lsh.hibernate.Pig" discriminator-value="P">
	<property name="weight"/>
	</subclass>
	<subclass name="com.lsh.hibernate.Bird" discriminator-value="B">
	<property name="height"/>
	</subclass>
</class>

優缺點:首先表中引入的區分子類的字段,也就是包括了描述其他字段的字段。其次,如果某個子類的某個屬性不能爲空,那麼在數據庫一級不能設置該字段not null(非空),維護起來方便,只需要修改一個表,靈活性差,表中冗餘字段會隨着子類的增多而越來越多,在任何情況下,都只需處理一個表,對於單個對象的持久話操作只需要處理一個表

(2)具體繼承表,每個子類一個表。如下圖:


Animal.hbm.xml中的文件代碼:

<class name="Animal" table="t_animal">
	<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="Bird" table="t_bird">
	      <key column="bid"/>
	      <property name="height"/>
	</joined-subclass>
</class>

優缺點:這種設計方式完全符合關係模型的設計原則,且不存在冗餘,維護起來比較方便,對每個類的修改只需要修改其所對應的表,靈活性很好,完全是參照對象繼承的方式進行配置,對於父類的查詢需要使用左外鏈接,對於子類查詢需要使用內鏈接,對於子類的持久話至少要處理兩個表

(3)類表繼承。每個具體類一個表(有一些限制)。如下圖:


Animal.hbm.xml中的文件代碼:

<class name="Animal" table="t_animal">
	<id name="id">
	    <generator class="assigned"/>
	</id>
	<property name="name"/>
	<property name="sex"/>
	<union-subclass name="Pig" table="t_pig">
	<property name="weight"></property>
	</union-subclass>
	<union-subclass name="Bird" table="t_bird">
	<property name="height"></property>
	</union-subclass>
</class>

優缺點:這種設計方式符合關係模型的設計原則,但有表中存在重複字段的問題。如果需要對基類進行修改,則需要對基類以及該類的子類所對應的所有表都進行修改,映射的靈活性很大,子類可以包括基類屬性在內的每一個屬性進行單獨配置,對於子類的查詢只需要訪問單獨的表,對父類查詢怎需要檢索所有的表,對於單個對象持久話操作只需要處理一個表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章