天天看點

Hibernate-繼承映射

hibernate的繼承映射有三種:subclass、joined-subclass、union-subclass

這三種各有其能,在不能的情況能發揮不能作用。

1、subclass 一張大表

需要引入辨識者列(discriminator)

<!-- 映射Person類 -->
	<class name="Person" table="person_inf7" discriminator-value="普通人">
		<!-- 映射辨別屬性 -->
		<id name="id" column="person_id">
			<!-- 使用identity的主鍵生成器政策 -->
			<generator class="identity"/>
		</id>
		<!-- 映射辨識者列 -->
		<discriminator column="wawa" type="string"/>
		<!-- 如下映射兩個基本屬性 -->
		<property name="name" length="80"/>
		<property name="gender"/>
	   	<!-- 下面映射了一個元件屬性 -->
		<component name="address">
			<!-- 映射元件屬性的三個成員屬性 -->
			<property name="detail"/>
			<property name="zip"/>
			<property name="country"/>
		</component>
		<!-- 使用subclass元素映射Person類的子類Employee -->
		<subclass name="Employee" discriminator-value="雇員">
			<!-- 映射兩個基本屬性 -->
			<property name="title" />
			<property name="salary" />
			<!-- 映射N-1的關聯映射 -->
			<many-to-one name="manager" column="manager_id"/>
			<!-- 映射與Customer類之間的1-N關聯 -->
			<set name="customers" inverse="true">
				<key column="empoyee_id"/>
				<one-to-many class="Customer"/>
			</set>
			<!-- 使用subclass元素映射Employee類的子類Manager -->
			<subclass name="Manager" discriminator-value="經理">
				<!-- 映射Manager類的基本屬性department -->
				<property name="department"/>
				<!-- 映射Manager類的關聯實體:Employee -->
				<set name="employees" inverse="true">
					<key column="manager_id"/>
					<one-to-many class="Employee"/>
				</set>
			</subclass>
		</subclass>
		<!-- 使用subclass映射Person的Customer子類 -->
		<subclass name="Customer" discriminator-value="顧客">
			<!-- 映射Customer類的comments屬性 -->
			<property name="comments"/>
			<!-- 映射Customer和Employee的關聯關系 -->
			<many-to-one name="employee" column="empoyee_id"/>
		</subclass>
	</class>
           

所有字段在一個大表裡,進行統計分析的時候,比較好用。

2、joined-subclass 父子表

使用這種政策,必須使用<key../>元素映射父子類的共有主鍵,<key../>元素映射的資料列即是主鍵列,也是外鍵列。

<!-- 映射Person類 -->	
	<class name="Person" table="person_inf">
		<!-- 映射辨別屬性 -->
		<id name="id" column="person_id">
			<!-- 使用identity的主鍵生成器政策 -->
			<generator class="identity"/>
		</id>
		<!-- 如下映射兩個基本屬性 -->
		<property name="name" length="80"/>
		<property name="gender"/>
		<!-- 下面映射了一個元件屬性 -->
		<component name="address">
			<!-- 映射元件屬性的三個成員屬性 -->
			<property name="detail"/>
			<property name="zip"/>
			<property name="country"/>
		</component>
		<!-- 使用joined-subclass元素映射Person類的Employee子類 -->
		<joined-subclass name="Employee" table="employee_inf">
			<!-- 必須使用key元素映射父子類的共有主鍵 -->
			<key column="employee_id"/>
			<!-- 映射Employee類的兩個普通屬性 -->
			<property name="title" not-null="true"/>
			<property name="salary" not-null="true"/>
			<!-- 映射Employee類與Manager類之間的N-1關聯-->
			<many-to-one name="manager" column="manager_id"/>
			<!-- 映射Employee類與Customer類之間的1-N關聯-->
			<set name="customers" inverse="true">
				<key column="empoyee_id"/>
				<one-to-many class="Customer"/>
			</set>
			<!-- 使用joined-subclass元素映射Employee類的Manager子類 -->
			<joined-subclass name="Manager" table="manager_inf">
				<!-- 必須使用key元素映射父子類的共有主鍵 -->
				<key column="manager_id"/>
				<!-- 映射Manager類的department屬性 -->
				<property name="department"/>
				<!-- 映射Employee類與Manager類之間的1-N關聯-->
				<set name="employees" inverse="true">
					<key column="manager_id"/>
					<one-to-many class="Employee"/>
				</set>
			</joined-subclass>
		</joined-subclass>
		<!-- 使用joined-subclass元素映射Person類的Customer子類 -->
		<joined-subclass name="Customer" table="customer_inf">
			<!-- 必須使用key元素映射父子類的共有主鍵 -->
			<key column="customer_id"/>
			<property name="comments" not-null="true"/>
			<!-- 映射Employee類與Customer類之間的1-N關聯-->
			<many-to-one name="employee" column="empoyee_id"
				not-null="true"/>
		</joined-subclass>
	</class>
           

一張大表不可能無限的大,大到一定程度就要生産字表

3、union-subclass 分類職能表

按列别分表,使每一個面向一個類别,即可以單獨使用,也可以關系在一起形成一張大表。

<!-- 映射Person類 -->	
	<class name="Person" table="person_inf">
		<!-- 映射辨別屬性 -->
		<id name="id" column="person_id">
			<!-- 不能使用identity的主鍵生成器政策
				,是以使用hilo主鍵生成器政策-->
			<generator class="hilo"/>
		</id>
		<!-- 如下映射兩個基本屬性 -->
		<property name="name" length="80"/>
		<property name="gender"/>
		<!-- 下面映射了一個元件屬性 -->
		<component name="address">
			<!-- 映射元件屬性的三個成員屬性 -->
			<property name="detail"/>
			<property name="zip"/>
			<property name="country"/>
		</component>
		<!-- 使用union-subclass元素映射Person類的Employee子類 -->
		<union-subclass name="Employee" table="employee_inf">
			<!-- 映射Employee類的兩個普通屬性 -->
			<property name="title" not-null="true"/>
			<property name="salary" not-null="true"/>
			<!-- 映射Employee類與Manager類之間的N-1關聯-->
			<many-to-one name="manager" column="manager_id"/>
			<!-- 映射Employee類與Customer類之間的1-N關聯-->
			<set name="customers" inverse="true">
				<key column="empoyee_id"/>
				<one-to-many class="Customer"/>
			</set>
			<!-- 使用union-subclass元素映射Employee類的Manager子類 -->
			<union-subclass name="Manager" table="manager_inf">
				<!-- 映射Manager類的department屬性 -->
				<property name="department"/>
				<!-- 映射Employee類與Manager類之間的1-N關聯-->
				<set name="employees" inverse="true">
					<key column="manager_id"/>
					<one-to-many class="Employee"/>
				</set>
			</union-subclass>
		</union-subclass>
		<!-- 使用union-subclass元素映射Person類的Customer子類 -->
		<union-subclass name="Customer" table="customer_inf">
			<property name="comments" not-null="true"/>
			<!-- 映射Employee類與Customer類之間的1-N關聯-->
			<many-to-one name="employee" column="empoyee_id"
				not-null="true"/>
		</union-subclass>
	</class>
           

總結:

一生二,二生四,四生萬象,最頂層的表适合從全局進行統計,不适合表象展現,最底層的表适合各種表象得展現,但很難掌控全局。

繼續閱讀