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

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

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

      第二种:每个子类一张表

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

      Student.hbm.xml

Xml代码 hibernate详解(二)----->>继承关系映射(二、三) hibernate详解(二)----->>继承关系映射(二、三)hibernate详解(二)----->>继承关系映射(二、三)
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7.     <!-- 映射持久化类 -->  
  8.     <class name="com.zxf.domain.Singer" table="singer">  
  9.         <!-- 映射对象标识符 -->  
  10.         <id name="id" column="id" type="long">  
  11.             <generator class="native" />  
  12.         </id>  
  13.   
  14.         <!-- 映射普通属性 -->  
  15.         <property name="name" />  
  16.         <property name="region" />  
  17.         <property name="description" />  
  18.            
  19.         <!-- 用joined-subclass元素给每个子类映射到一张表 -->  
  20.         <joined-subclass name="com.zxf.domain.SingleSinger"    
  21.                     table="single_singer">  
  22.             <!-- 用key元素来指定子类和父类之间是通过哪个字段来关联的 -->  
  23.             <key column="singler_id" />  
  24.             <!-- 映射本子类的属性 -->  
  25.             <property name="gender" />  
  26.         </joined-subclass>  
  27.         <!-- 用joined-subclass元素给每个子类映射到一张表 -->  
  28.         <joined-subclass name="com.zxf.domain.Bands"    
  29.                     table="bands">  
  30.           <!-- 用key元素来指定子类和父类之间是通过哪个字段来关联的 -->  
  31.             <key column="bands_id" />  
  32.             <!-- 映射本子类的属性 -->  
  33.             <property name="leader"/>  
  34.         </joined-subclass>  
  35.     </class>  
  36. </hibernate-mapping>  
<?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代码 hibernate详解(二)----->>继承关系映射(二、三) hibernate详解(二)----->>继承关系映射(二、三)hibernate详解(二)----->>继承关系映射(二、三)
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
  4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5.   
  6. <hibernate-mapping>  
  7.     <!-- 指定此类为抽象类 -->  
  8.     <class name="com.zxf.domain.Singer" abstract="true">  
  9.         <!-- 映射对象标识符 -->  
  10.         <id name="id" column="id" type="long">  
  11.             <!-- 映射主键生成方式为由Java应用程序负责生成标识符 -->  
  12.             <generator class="assigned" />  
  13.         </id>  
  14.         <!-- 映射普通属性 -->  
  15.         <property name="name" />  
  16.         <property name="region" />  
  17.         <property name="description" />  
  18.            
  19.         <!-- 用union-subclass元素给每个具体子类映射到一张表 -->  
  20.         <union-subclass name="com.zxf.domain.SingleSinger"    
  21.                     table="single_singer">  
  22.             <!-- 映射本子类的属性 -->  
  23.             <property name="gender" />  
  24.         </union-subclass>  
  25.         <!-- 用union-subclass元素给每个具体子类映射到一张表 -->  
  26.         <union-subclass name="com.zxf.domain.Bands"    
  27.                     table="bands">  
  28.             <!-- 映射本子类的属性 -->  
  29.             <property name="leader"/>  
  30.         </union-subclass>  
  31.     </class>  
  32. </hibernate-mapping>  
<?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详解(二)----->>继承关系映射(二、三)

    备注:

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

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

相关推荐