Hibernate映射(六)— 继承


单表继承


    关系图:



具体实现

1、实体

   Animal:
	/**
	 * 父类Animal实体
	 * @author gxq
	 *
	 */
	public class Animal {
		//定义id、名称、性别
		private int id;
		private String name;
		private boolean sex;
		
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public boolean isSex() {
			return sex;
		}
		public void setSex(boolean sex) {
			this.sex = sex;
		}
	}

Pig:
	/**
	 * 子类Pig
	 * @author gxq
	 *
	 */
	public class Pig extends Animal {
		//重量
		private String weight;
	
		public String getWeight() {
			return weight;
		}
	
		public void setWeight(String weight) {
			this.weight = weight;
		}
	}
Bird:
	/**
	 * 子类Bird
	 * @author gxq
	 *
	 */
	public class Bird extends Animal {
		//高度
		private String height;
	
		public String getHeight() {
			return height;
		}
	
		public void setHeight(String height) {
			this.height = height;
		}
	}

2、映射文件

    <hibernate-mapping package="com.bjpowernode.inherit">
		<class name="Animal" table="t_animal">
			<id name="id">
				<generator class="native"/>
			</id>
			<!-- 公共属性映射 -->
			<discriminator column="type" type="string"></discriminator>
			<property name="name"/>
			<property name="sex"></property>
			
			<!-- Pig特有属性映射 -->
			<subclass name="Pig" discriminator-value="P">
				<property name="weight"></property>
			</subclass>
			
			<!-- Bird特有属性映射 -->
			<subclass name="Bird" discriminator-value="B">
				<property name="height"></property>
			</subclass>
		</class>
	</hibernate-mapping>
	注:
	Discriminator映射:就是把一个表应射程不同的类,有不同的属性</span>


3、配置文件(hibernate.cfg.xml)

<span style="font-size:18px;">	<hibernate-configuration>
		<session-factory>
			<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
			<property name="hibernate.connection.url">
	        <![CDATA[jdbc:mysql://localhost:3306/Hibernate?useUnicode=true&characterEncoding=utf8]]>
			</property>
			<property name="hibernate.connection.username">root</property>
			<property name="hibernate.connection.password">root</property>
			<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
			<property name="hibernate.hbm2ddl.auto">update</property>
			<property name="hibernate.show_sql">true</property>
		
		    <mapping resource="com/bjpowernode/inherit/Animal.hbm.xml"/>
		</session-factory>
	</hibernate-configuration></span><span style="font-size: 18px; font-family: SimSun;"> </span>


4、封装好的工具类:HibernateUtils

<span style="font-size:18px;">	/**
	 * 工具类(封装开启session和事务)
	 * @classname   HibernateUtils 
	 * @author      高晓青
	 * @date        2015-4-16 下午2:56:42 
	 * @version     hibernate
	 */
	public class HibernateUtils {
		private static SessionFactory factory;
		
		static{
			try {
				//默认读取的是hibernate.cfg.xml
				Configuration cfg = new Configuration().configure();
				
				//建立sessionFactory
				factory = cfg.buildSessionFactory();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		//开启session
		public static Session getSession(){
			return factory.openSession();
		}
		
		//关闭session
		public static void closeSession(Session session){
			//判断是否为空
			if(session!=null){
				//判断是否是打开状态再进行关闭
				if(session.isOpen()){
					session.close();
				}
			}
		}
	}
</span>


5、添加

<span style="font-size:18px;">   public void testSingle(){
		Session session=null;
		
		try {
			session=HibernateUtils.getSession();
			session.beginTransaction();
			
			//实例化Pig
			Pig pig=new Pig();
			pig.setName("小猪猪");
			pig.setSex(true);
			pig.setWeight("100斤");
			session.save(pig);
			
			//实例化Bird
			Bird bird=new Bird();
			bird.setName("小鸟鸟");
			bird.setSex(false);
			bird.setHeight("200米");
			session.save(bird);
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
}
</span>



6、查询

   情况1

<span style="font-size:18px;">	/**
	 * 根据子类Pig的id查询
	 */
	public void testLoad1(){
		Session session=null;
		try {
			//获取session,打开事务
			session=HibernateUtils.getSession();
			session.beginTransaction();
			
			//根据id查询
			Pig pig=(Pig) session.load(Pig.class,1);
			System.out.println(pig.getName());
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			HibernateUtils.closeSession(session);
		}
	}
	</span>

  情况2

<span style="font-size:18px;">	/**
	 * 根据父类Animal查询
	 */
	public void testLoadAnimal(){
		Session session=null;
		try {
			//获取session,打开事务
			session=HibernateUtils.getSession();
			session.beginTransaction();
			
			//根据id查询
			Animal animal=(Animal) session.load(Animal.class,1);
			System.out.println(animal.getName());
			
			//提交事务
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			HibernateUtils.closeSession(session);
		}
	}</span>


 

类表继承


     关系图


 

具体实现

1、实体

与单表继承一致

2、映射文件

<span style="font-size:18px;">	<hibernate-mapping package="com.bjpowernode.inherit">
		<class name="Animal" table="t_animal">
			<id name="id">
				<generator class="native"/>
			</id>
			
			<!-- 公共属性映射 -->
			<property name="name"/>
			<property name="sex"></property>
			
			<!-- Pig为单独一张表 -->
			<joined-subclass name="Pig" table="t_pig">
				<key column="pid"></key>
				<property name="weight"></property>
			</joined-subclass> 
			
			<!-- Bird为单独一张表 -->
			<joined-subclass name="Bird" table="t_bird">
				<key column="bid"></key>
				<property name="height"></property>
			</joined-subclass>
		</class>
	</hibernate-mapping></span>


3、配置文件

与单表继承一致

4、封装好的工具类:HibernateUtils

与单表继承一致

5、添加 

	public void testClass(){
			Session session=null;
			
			try {
				session=HibernateUtils.getSession();
				session.beginTransaction();
				
				//实例化Pig
				Pig pig=new Pig();
				pig.setName("小猪猪");
				pig.setSex(true);
				pig.setWeight("100斤");
				session.save(pig);
				
				//实例化Bird
				Bird bird=new Bird();
				bird.setName("小鸟鸟");
				bird.setSex(false);
				bird.setHeight("200米");
				session.save(bird);
				
				session.getTransaction().commit();
			} catch (Exception e) {
				e.printStackTrace();
			}
	}


6、查询   

	/**
	 * 根据子类Pig的id查询
	 */
	public void testLoad1(){
		Session session=null;
		try {
			//获取session,打开事务
			session=HibernateUtils.getSession();
			session.beginTransaction();
			
			//根据id查询
			Pig pig=(Pig) session.load(Pig.class,1);
			System.out.println(pig.getName());
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			HibernateUtils.closeSession(session);
		}
	}
	




具体表继承


     关系图



具体实现

1、实体、配置问题件、封装好的工具类:HibernateUtils:与单表继承一致

2、映射文件

	<hibernate-mapping package="com.bjpowernode.inherit">
		<class name="Animal" table="t_animal" abstract="true">
			<id name="id">
				<generator class="assigned"/>
			</id>
			
			<!-- 公共属性映射 -->
			<property name="name"/>
			<property name="sex"></property>
			
			<!-- Pig为单独一张表 -->
			<union-subclass name="Pig" table="t_pig">
				<property name="weight"></property>
			</union-subclass> 
			
			<!-- Bird为单独一张表 -->
			<union-subclass name="Bird" table="t_bird">
				<property name="height"></property>
			</union-subclass>
		</class>
	</hibernate-mapping>

    注:

       (1)主键必须为手动分配

       (2)配置文件中加入abstract="true",生成2张子表,不生成父表;如不加则会生成3张表

3、添加

<span style="font-size:18px;">   public void testSingle(){
		Session session=null;
		
		try {
			session=HibernateUtils.getSession();
			session.beginTransaction();
			
			//实例化Pig
			Pig pig=new Pig();
			pig.setId(1);
			pig.setName("小猪猪");
			pig.setSex(true);
			pig.setWeight("100斤");
			session.save(pig);
			
			//实例化Bird
			Bird bird=new Bird();
			bird.setId(2);
			bird.setName("小鸟鸟");
			bird.setSex(false);
			bird.setHeight("200米");
			session.save(bird);
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
        }</span>


情况1:生成父类表


 

情况2:不生成父类

在配置文件中加入:abstract="true"


区别


   单表继承(1张表)

原则:

所有数据存储在一张表中

特点:

引入区分子类的字段

若涉及到的类有很多字段,则放到一张表里的话,这张表里会有非常多的字段,存储数据时,很多字段都是NULL


    类表继承(3张表)

原则:

每个子类一张表,但这些子类对应的表都关联到基类所对应的表中

特点:

完全符合关系模型的设计原则,且不存在冗余,


    具体表继承:(2/3张表)

原则:

每个子类一张表,父类可有,也可设置无

特点:

不支持identity生成策略,要求整个继承结构即所有表所有记录的id不能重复

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值