hibernate详解(二)----->>继承关系映射(二、三)

hibernate详解(二)----->>继承关系映射(二、三)

      这篇文章紧接着hibernate详解(二)----->>继承关系映射(一)。

    下面介绍另外两种关系继承关系映射方案:

      第二种:每个子类一张表

      其他的类都一样,就有一个xml文件不一样,里面有些内容不一样

      Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<!-- 映射持久化类 -->
	<class name="com.zxf.domain.Singer" table="singer">
		<!-- 映射对象标识符 -->
		<id name="id" column="id" type="long">
			<generator class="native" />
		</id>

		<!-- 映射普通属性 -->
		<property name="name" />
		<property name="region" />
		<property name="description" />
		
		<!-- 用joined-subclass元素给每个子类映射到一张表 -->
		<joined-subclass name="com.zxf.domain.SingleSinger" 
					table="single_singer">
			<!-- 用key元素来指定子类和父类之间是通过哪个字段来关联的 -->
			<key column="singler_id" />
			<!-- 映射本子类的属性 -->
			<property name="gender" />
		</joined-subclass>
		<!-- 用joined-subclass元素给每个子类映射到一张表 -->
		<joined-subclass name="com.zxf.domain.Bands" 
					table="bands">
		  <!-- 用key元素来指定子类和父类之间是通过哪个字段来关联的 -->
			<key column="bands_id" />
			<!-- 映射本子类的属性 -->
			<property name="leader"/>
		</joined-subclass>
	</class>
</hibernate-mapping>
 

   运行结果如下图所示:

     hibernate详解(二)----->>继承关系映射(二、三)

     hibernate详解(二)----->>继承关系映射(二、三)

     hibernate详解(二)----->>继承关系映射(二、三)

          第三种:每个具体类一张表

    其他的类都一样,就有一个xml文件不一样,里面有些内容不一样

      Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<!-- 指定此类为抽象类 -->
	<class name="com.zxf.domain.Singer" abstract="true">
		<!-- 映射对象标识符 -->
		<id name="id" column="id" type="long">
			<!-- 映射主键生成方式为由Java应用程序负责生成标识符 -->
			<generator class="assigned" />
		</id>
		<!-- 映射普通属性 -->
		<property name="name" />
		<property name="region" />
		<property name="description" />
		
		<!-- 用union-subclass元素给每个具体子类映射到一张表 -->
		<union-subclass name="com.zxf.domain.SingleSinger" 
					table="single_singer">
			<!-- 映射本子类的属性 -->
			<property name="gender" />
		</union-subclass>
		<!-- 用union-subclass元素给每个具体子类映射到一张表 -->
		<union-subclass name="com.zxf.domain.Bands" 
					table="bands">
			<!-- 映射本子类的属性 -->
			<property name="leader"/>
		</union-subclass>
	</class>
</hibernate-mapping>
 

      运行结果如下图所示:

     hibernate详解(二)----->>继承关系映射(二、三)

     hibernate详解(二)----->>继承关系映射(二、三)

    备注:

          继承映射最常用的方案就是以上介绍的三种,在实际开发中,怎么选择合适的方案,笔者根据自己的工作经验,给读者提供一些经验。

  •           如果不需要度多态查询:使用每个具体类一张表。
  •        一定要使用多态查询:子类中的属性相对较少,使用每个继承层次一张表。
  •        子类中的属性较多,使用每个子类一张表。
  •        简单的问题一般选择每个继承层次一张表,复杂案例额一般选择每个子类一表。

相关推荐