• 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中对象的三大状态的理解,对于我们非常好的处理对象有非常多的优点,所以我们要弄清这三个对象。以及对象之间的转换!

     

  • 相关阅读:
    php高级进阶系列文章--第二篇(PHP基础知识复习)
    开发常用linux命令
    composer 包管理工具学习总结
    微信菜单加emoji图标
    onethink导出excel
    onethinkp导入excel
    导航效果css
    php发送邮件
    js初学者的div移动
    html图片预览
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7078882.html
Copyright © 2020-2023  润新知