ORM进阶之Hibernate中对象的三大状态解析


        ORM进阶之 ORM简介

        ORM进阶之Hibernate简介及框架搭

        ORM进阶之Hibernate的三大对象

        ORM进阶之Hibernate中对象的三大状态解析


       在Hibernatea中每个对象都有三种状态,他们在这三种状态下,Hibernate会他们进行不同的处理。下边我们通过一张图来看一下这三种状态以及他们之间的互相转换!

      

       可以看到对象可能会有这三种状态,临时状态(transient),持久化状态(persistent),游离状态(detached)。下边我们来分别来解释一下这三种状态。

临时状态(Transient Objects)

       通过 new 创建的对象,是临时对象,如果临时对象不做任何操作的话,会被gc回收,说明这种状态的对象没有与数据库有交互的能力,存在于session缓存外。

       临时对象的是不处于Session缓存中,没有与任何Session实例关联,并且数据库中没有相对应的记录,而且编码的时候可以为临时对象设置OID值,但最终Hibernate不会采用,它用的是内置的主键生成策略。

 

以下情况,java对象进入临时状态 

       (1) 当通过new语句刚创建了一个Java对象,它处于临时状态,此时不和数据库中的任何记录对应。

      (2) Session的delete()方法能使一个持久化对象或游离对象转变为临时对象。对于临时对象,delete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()方法从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。

看一下代码展示

<span style="font-size:18px;">public class UserService {
      public void  add() {
             //创建一个   Configuration 
         Configuration cfg = newConfiguration().configure(); 
         SessionFactory factory = cfg.buildSessionFactory();
         //打开session
         Session session = factory.openSession(); 
         //开启事务
         Transaction tran = session.beginTransaction(); 
         //创建一个user对象
//       User user = new User(); 
//       user.setId(1001);
//       user.setUsername("zhanghongjie");
//       user.setPasswords("zhanghongjie");
         /*
          * 此时的user是临时状态。不在缓存中,也不会与数据库进行交互
         */
         User user=(User)session.load(User.class, 1001);
         session.delete(user);
         /*
          * 此时的user是临时状态。不在缓存中,也不会与数据库进行交互,但是在数据库中会有相应的记录
          */
          //提交事务。保存到数据库中
         tran.commit(); 
         session.close();  
    }
}</span>

持久化对象(Persist Objects)

       持久化对象是具有数据库标识的实例,由Session统一管理,持久实例是在事务中操作,他们的状态在事务借宿的同时与数据库同步。当事务提交时,通过执行SQL的INSET,UPDATE和DELETE语句把内存中的状态同步到数据库中。

持久化特征总结:

       1.位于Session实例的缓存中,也可以说持久化对象被一个Session实例关联 

       2.持久化对象鱼数据库中的记录相对应

       3.Session在清理缓存时(session.flush),会根据持久化对象的属性变化,来同步更新数据库

       4.Hibernate 保证在同一个Session实例的缓存中,数据库表中的每条记录只对应惟一的持久化对象,即 hibernate会为持久化对象分配惟一的OID标识这个持久化对象

以下情况,java对象进入持久化状态

      1.通过 save()方法将一个临时对象转为持久对象 

      2.通过get()或load()方法将数据库表中的记录转成持久化对象 

      3.通过find()方法返回的List集合中的对象也是持久化对象 

      4.通过update()或saveOrUpdate()和lock()方法使 游离对象 转化为 持久化对象

<span style="font-size:18px;">public class UserService {
	public void  add() {
		//创建一个   Configuration  
		Configuration cfg = new Configuration().configure();  
		//创建SessionFactory         
		SessionFactory factory = cfg.buildSessionFactory(); 
		//打开session
		Session session = factory.openSession();  
		//开启事务
		Transaction tran = session.beginTransaction();  
		//创建一个user对象
		/*
		 *第一种情况
		User user = new User();  
		user.setId(1001);
		user.setUsername("zhanghongjie");
		user.setPasswords("zhanghongjie");
		session.save(user);
		user.setUsername("hongjie");
	 	session.update(user);
		 */
		/* 第二种情况
		User user=(User)session.load(User.class, 1001);
		*/
		/*
	 * 以上的情况  的user是持久化状态。在缓存中,也可以与数据库进行交互
		 */
		//提交事务。 保存到数据库中
		tran.commit();  
	    session.close();   
	}
}</span>


游离对象(Detached Objects)

      Session关闭后,或者清除Session缓存和清除指定缓存,持久化对象变为游离对象,此时该对象不能再与数据库交互,也就是不能同步,不再受Hibernate管理。

游离对象的特征总结: 

      1.不在Session一级缓存里面,但又有OID值。

      2.数据库里也有相对于的记录存在(除非其他操作删除了该记录),但不再具有和数据库交互的能力,不能再同步。

public class UserService {
	public void  add() {
		//创建一个   Configuration  
		Configuration cfg = new Configuration().configure();  
		//创建SessionFactory         
		SessionFactory factory = cfg.buildSessionFactory(); 
		//打开session
		Session session = factory.openSession();  
		//开启事务
		Transaction tran = session.beginTransaction();  
		//创建一个user对象
		User user =(User)session.load(User.class, 1001);
		tran.commit();  
	    session.close();  
	    /*
	     * 这个时候session关闭了, 我们可以操作user对象,但是不能与数据库进行交互!
	     */
	}
}

游离对象和临时对象区别

       两者都不被session关联,就算属性变化也不能与数据库保持同步,而游离对象是由持久化对象转变而来,所以数据库中有对应记录(除非删除),而临时对象在数据库并没有记录,用恰当比喻来说,游离对象相当于退休老人,退休老人不在岗位上,但资料库里还有他以前相关的记录,而临时对象是还没正式进入这家公司的年轻人,还没上岗,资料库也没有年轻人的记录。Hibernate中对象的三大状态的理解,对于我们很好的处理对象有很多的好处,所以我们要弄清这三个对象,以及对象之间的转换!

 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值