天天看点

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>
           

总结:

一生二,二生四,四生万象,最顶层的表适合从全局进行统计,不适合表象展现,最底层的表适合各种表象得展现,但很难掌控全局。

继续阅读