`

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

阅读更多
 

         继承是面对对象编程中一个很重要的特征,在做面对对象的分析和设计时,经常会设计出具体继承关联的持久化类,如何把这些持久化类之间的继承关系映射到关系数据库上的问题已经解决,继承在对象模型中是 is a(是一个)的关系,但是在关系模型中,实体之间只有has a(有一个)的关系,也就是说,继承在对象模型和关系模型上是不匹配的。所幸的是,hibernate提供了3种常见的基继承映射方案。

 

      第一种:整个继承层次一张表

 

Singer.java

 

Java代码 复制代码 收藏代码
  1. package com.zxf.domain;   
  2.   
  3. /** 歌手抽象类 */  
  4. public abstract class Singer {   
  5.     private Long id;                //对象标识符(OID)   
  6.     private String name;            //名称   
  7.     private String region;          //歌手所属区域(如:华人、日韩、欧美等)   
  8.     private String description;     //描述   
  9.   
  10.     public Singer(){}               //无参数的构造方法   
  11.   
  12.     //以下为所有属性的getters和setters方法...   
  13. }  
package com.zxf.domain;

/** 歌手抽象类 */
public abstract class Singer {
	private Long id;                //对象标识符(OID)
	private String name;            //名称
	private String region;          //歌手所属区域(如:华人、日韩、欧美等)
	private String description;     //描述

	public Singer(){}               //无参数的构造方法

	//以下为所有属性的getters和setters方法...
}

 

SingleSinger.java

 

Java代码 复制代码 收藏代码
  1. package com.zxf.domain;   
  2.   
  3.   
  4. /** 单人歌手实体类 */  
  5. public class SingleSinger extends Singer {   
  6.     private Character gender;       //性别   
  7.        
  8.     public SingleSinger(){}         //无参数的构造方法   
  9.        
  10.     //以下为所有属性的getters和setters方法...   
  11. }  
package com.zxf.domain;


/** 单人歌手实体类 */
public class SingleSinger extends Singer {
	private Character gender;       //性别
	
	public SingleSinger(){}         //无参数的构造方法
	
	//以下为所有属性的getters和setters方法...
}

 

Bands.java

 

Java代码 复制代码 收藏代码
  1. package com.qiujy.domain;   
  2.   
  3.   
  4. /** 乐队组合实体类 */  
  5. public class Bands extends Singer {   
  6.     private String leader;       //主唱姓名   
  7.        
  8.     public Bands(){}             //无参数的构造方法   
  9.   
  10.     //以下为所有属性的getters和setters方法...   
  11. }  
package com.qiujy.domain;


/** 乐队组合实体类 */
public class Bands extends Singer {
	private String leader;       //主唱姓名
	
	public Bands(){}             //无参数的构造方法

	//以下为所有属性的getters和setters方法...
}

 

Singer.hbm.xml

 

Xml代码 复制代码 收藏代码
  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.         <discriminator column="type" type="string" />  
  15.         <!-- 映射普通属性 -->  
  16.         <property name="name"/>  
  17.         <property name="region"/>  
  18.         <property name="description"/>  
  19.            
  20.         <!-- 映射子类,指定鉴别字段值 -->  
  21.         <subclass name="com.zxf.domain.SingleSinger"    
  22.                     discriminator-value="S">  
  23.             <!-- 映射本子类的属性 -->  
  24.             <property name="gender"/>  
  25.         </subclass>  
  26.         <!-- 映射子类,指定鉴别字段值 -->  
  27.         <subclass name="com.zxf.domain.Bands"    
  28.                     discriminator-value="B">  
  29.             <!-- 映射本子类的属性 -->  
  30.             <property name="leader"/>  
  31.         </subclass>  
  32.     </class>  
  33. </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>
		<!-- 指定鉴别器字段,要放置在所有属性映射之前 -->
		<discriminator column="type" type="string" />
		<!-- 映射普通属性 -->
		<property name="name"/>
		<property name="region"/>
		<property name="description"/>
		
		<!-- 映射子类,指定鉴别字段值 -->
		<subclass name="com.zxf.domain.SingleSinger" 
					discriminator-value="S">
			<!-- 映射本子类的属性 -->
	   		<property name="gender"/>
	  	</subclass>
	  	<!-- 映射子类,指定鉴别字段值 -->
	  	<subclass name="com.zxf.domain.Bands" 
	  				discriminator-value="B">
	  		<!-- 映射本子类的属性 -->
	    	<property name="leader"/>
 	 	</subclass>
	</class>
</hibernate-mapping>
 

配置文件  hibernate.cfg.xml

 

Xml代码 复制代码 收藏代码
  1. <?xml version='1.0' encoding='UTF-8'?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC   
  3.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  4.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5.   
  6. <hibernate-configuration>  
  7.     <session-factory>  
  8.            
  9.         <!-- 数据库方言设置 -->  
  10.         <property name="hibernate.dialect">  
  11.             org.hibernate.dialect.MySQLInnoDBDialect   
  12.         </property>  
  13.            
  14.         <!-- 数据库连接参数设置 -->  
  15.         <property name="hibernate.connection.driver_class">  
  16.             com.mysql.jdbc.Driver   
  17.         </property>  
  18.         <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>  
  19.         <property name="hibernate.connection.username">root</property>  
  20.         <property name="hibernate.connection.password">123</property>  
  21.        
  22.         <!--实际操作数据库时是否显示SQL -->  
  23.            
  24.         <property name="hibernate.show_sql">true</property>  
  25.         <property name="hibernate.format_sql">true</property>  
  26.            
  27.            
  28.         <!--将数据库schema的DDL导出到数据库 -->  
  29.         <property name="hibernate.hbm2ddl.auto">update</property>  
  30.   
  31.         <!-- 以下定义实体类与数据库表的映像文件 -->  
  32.         <mapping resource="com/zxf/domain/Singer.hbm.xml" />  
  33.     </session-factory>  
  34. </hibernate-configuration>  
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		
		<!-- 数据库方言设置 -->
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLInnoDBDialect
		</property>
		
		<!-- 数据库连接参数设置 -->
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123</property>
	
		<!--实际操作数据库时是否显示SQL -->
		
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		
		
		<!--将数据库schema的DDL导出到数据库 -->
		<property name="hibernate.hbm2ddl.auto">update</property>

		<!-- 以下定义实体类与数据库表的映像文件 -->
		<mapping resource="com/zxf/domain/Singer.hbm.xml" />
	</session-factory>
</hibernate-configuration>

 

下面写一个测试类来测试一下:

 

SingerTest.java

 

Java代码 复制代码 收藏代码
  1. import java.util.List;   
  2.   
  3. import org.hibernate.Session;   
  4. import org.hibernate.SessionFactory;   
  5. import org.hibernate.cfg.Configuration;   
  6.   
  7. import com.zxf.domain.Bands;   
  8. import com.zxf.domain.Singer;   
  9. import com.zxf.domain.SingleSinger;   
  10.   
  11. /**  
  12.  * 继承映射测试  
  13.  * @author z_xiaofei168  
  14.  */  
  15. public class SingerTest {   
  16.   
  17.     @SuppressWarnings("unchecked")   
  18.     public static void main(String[] args) {   
  19.         //根据hibernate的默认配置文件构建一个SessoinFactory实例   
  20.         SessionFactory sessionFactory =    
  21.             new Configuration().configure().buildSessionFactory();    
  22.         testAdd(sessionFactory);   
  23.         testQuery(sessionFactory);   
  24.     }   
  25.   
  26.     public static void testAdd(SessionFactory sessionFactory) {   
  27.         //获取Session实例   
  28.         Session session = sessionFactory.openSession();   
  29.            
  30.         //开启事务   
  31.         session.beginTransaction();   
  32.            
  33.         SingleSinger singer = new SingleSinger();   
  34.         singer.setName("周杰棍");   
  35.         singer.setRegion("华人");   
  36.         singer.setDescription("大舌头");   
  37.         singer.setGender('男');   
  38.            
  39.         session.save(singer);   
  40.            
  41.         Bands bands = new Bands();   
  42.         bands.setName("花朵乐队");   
  43.         bands.setRegion("日韩");   
  44.         bands.setDescription("以口水歌为主");   
  45.         bands.setLeader("大伟");   
  46.            
  47.         session.save(bands);   
  48.   
  49.         //提交事务   
  50.         session.getTransaction().commit();    
  51.            
  52.         //关闭Session   
  53.         session.close();   
  54.     }   
  55.        
  56.     public static void testQuery(SessionFactory sessionFactory) {   
  57.         //获取Session实例   
  58.         Session session = sessionFactory.openSession();   
  59.            
  60.         //开启事务   
  61.         session.beginTransaction();   
  62.            
  63.         List<Singer> singers = session.createQuery("from Singer").list();   
  64.         for (Singer singer2 : singers) {   
  65.             if(singer2 instanceof SingleSinger){   
  66.                 SingleSinger ss = (SingleSinger)singer2;   
  67.                 System.out.println("是单人歌手:" + ss.getName() + ",性别:" + ss.getGender());   
  68.             }else if(singer2 instanceof Bands){   
  69.                 Bands ban = (Bands)singer2;   
  70.                 System.out.println("是乐队组合:" + ban.getName() + ",主唱:" + ban.getLeader());   
  71.             }   
  72.         }   
  73.            
  74.         //提交事务   
  75.         session.getTransaction().commit();    
  76.            
  77.         //关闭Session   
  78.         session.close();   
  79.     }   
  80.   
  81. }  
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.zxf.domain.Bands;
import com.zxf.domain.Singer;
import com.zxf.domain.SingleSinger;

/**
 * 继承映射测试
 * @author z_xiaofei168
 */
public class SingerTest {

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		//根据hibernate的默认配置文件构建一个SessoinFactory实例
		SessionFactory sessionFactory = 
			new Configuration().configure().buildSessionFactory(); 
		testAdd(sessionFactory);
		testQuery(sessionFactory);
	}

	public static void testAdd(SessionFactory sessionFactory) {
		//获取Session实例
		Session session = sessionFactory.openSession();
		
		//开启事务
		session.beginTransaction();
		
		SingleSinger singer = new SingleSinger();
		singer.setName("周杰棍");
		singer.setRegion("华人");
		singer.setDescription("大舌头");
		singer.setGender('男');
		
		session.save(singer);
		
		Bands bands = new Bands();
		bands.setName("花朵乐队");
		bands.setRegion("日韩");
		bands.setDescription("以口水歌为主");
		bands.setLeader("大伟");
		
		session.save(bands);

		//提交事务
		session.getTransaction().commit(); 
		
		//关闭Session
		session.close();
	}
	
	public static void testQuery(SessionFactory sessionFactory) {
		//获取Session实例
		Session session = sessionFactory.openSession();
		
		//开启事务
		session.beginTransaction();
		
		List<Singer> singers = session.createQuery("from Singer").list();
		for (Singer singer2 : singers) {
			if(singer2 instanceof SingleSinger){
				SingleSinger ss = (SingleSinger)singer2;
				System.out.println("是单人歌手:" + ss.getName() + ",性别:" + ss.getGender());
			}else if(singer2 instanceof Bands){
				Bands ban = (Bands)singer2;
				System.out.println("是乐队组合:" + ban.getName() + ",主唱:" + ban.getLeader());
			}
		}
		
		//提交事务
		session.getTransaction().commit(); 
		
		//关闭Session
		session.close();
	}

}

 

 

程序的运行结果如下所示:

 

 

 

 

<script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承关系树的每个类对应一个...

    spring MVC配置详解

    -- 可以自定义 servlet.xml 配置文件的位置和名称,默认为 WEB-INF 目录下,名称为[&lt;servlet-name&gt;]-servlet.xml,如 spring-servlet.xml --&gt; &lt;init-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; ...

    Hibernate_映射配置文件详解

    Hibernate_映射配置文件详解,个人觉的比较不错的关于hibernate讲解的ppt,对于xml配置,继承关系,多对多等关系映射讲的很详细!

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和...

    Hibernate详解

    该文档详细讲解了Hibernate的几个核心技术:Hibernate的配置文件、缓存机制、查询策略、事务管理、HQL和QBC、一对多、一对一、多对多映射关系、继承映射等,并且还有配有实例。

    hibernate 框架详解

    10. 继承映射(Inheritance Mappings) 10.1. 三种策略 10.1.1. 每个类分层结构一张表(Table per class hierarchy) 10.1.2. 每个子类一张表(Table per subclass) 10.1.3. 每个子类一张表(Table per subclass),...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承关系树的每个类对应一个...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承关系树的每个类对应一个...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承关系树的每个类对应一个...

    Hibernate 课件_配置文件详解

    我培训用的 Hibernate课件, 个人能力范围内精心整理,图文并茂. 希望能对大家学习 Hibernate 提供帮助. 这是第二篇, 内容如下:Hibernate配置文件;jdbc.fetch_size;jdbc.batch_size; POJO 类和数据库的映射...继承映射

    Hibernate实战(第2版 中文高清版)

    第一部分 从Hibernate和EJB 3.0开始  第1章 理解对象/关系持久化   1.1 什么是持久化   1.1.1 关系数据库   1.1.2 理解SQL   1.1.3 在Java中使用SQL   1.1.4 面向对象应用程序中的持久化   1.2 范式不...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和...

    spring、Struts2、hibernate常见面试题

    * 使用 Hibernate 是因为 Hibernate 提供了一个易用的、高效率的对象关系映射框架,可以帮助开发者更好的处理数据持久化问题。 * 使用 Spring 是因为 Spring 基于 IoC 和 AOP 构架,可以帮助开发者更好的实现模块化...

    轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate整合开发chap2

    第三部分示范开发了一个包含7个表,表之间具有复杂的关联映射、继承映射等关系,且业务也相对复杂的工作流案例,让读者理论联系实际,将三个框架真正运用到实际开发中去。该案例采用目前最流行、最规范的Java EE架构...

    低清版 大型门户网站是这样炼成的.pdf

    4.3.11 映射继承关系 260 4.3.12 hibernate的集合映射 266 4.4 小结 270 第5章 hibernate 3持久化技术实践与性能优化 271 5.1 操作持久化对象的常用方法介绍 271 5.1.1 使用session的begintransaction()方法 ...

    java从入门到精通70个PPT

    43 Hibernate 关联映射 44 HQL实用技术 45 HQL高级 46 Criteria 查询 47-49 项目实战 影院信息查询系统 50 pl/sql 51 Oracle数据库对象 52 提高数据库性能 53 hibernate总结 54 使用Spring容器管理JavaBean 55 ...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    12.5 使用Hibernate的工具快速生成映射文件和POJO 12.5.1 使用MiddleGen根据数据库产生映射文件 12.5.2 使用hbm2java根据映射文件产生POJO 12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和...

    spring chm文档

    3.3.3. bean属性及构造器参数详解 3.3.4. 使用depends-on 3.3.5. 延迟初始化bean 3.3.6. 自动装配(autowire)协作者 3.3.7. 依赖检查 3.3.8. 方法注入 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. ...

Global site tag (gtag.js) - Google Analytics