【SSH系列】-- Hibernate持久化对象的三种状态

来源:互联网 发布:陕西医药中标数据网 编辑:程序博客网 时间:2024/05/22 01:53
       在上一篇博文中,小编主要简单的介绍了【SSH系列】--hibernate基本原理&&入门demo ,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是从通过new语句创建开始,到不再被任何引用变量引用结束,结束后它占用的内存将被JVM垃圾回收机制收回。在hibernate中持久化类的对象可以划分为三种状态,分别是瞬态,持久态,脱管态。
       一、瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下:
       a、不在Session的缓存中,不与任何的Session实例相关联。
       b、在数据库中没有与之相对应的记录。
       二、持久态(Persistent),处于这种状态的对象具备的特征如下:
       a、在Session的缓存中,与Session实例相关联。
       b、在数据库中存在与之相对应的记录。
       三、脱管态(Detached),也叫游离态。处于这种状态的对象具备的特征如下:
       a、不在Session的缓存中,不与任何的Session实例相关联。
       b、 在数据库中存在与之相对应的记录。(前提条件是没有其他Session实例删除该条记录)。
 
       持久化对象的三种状态是可以相互转化的,具体转换过程如图所示:
        
       图画的有点粗糙,还请小伙伴们多多包涵,接着,小编结合代码实例来更加详细的介绍,这三种状态。
       Transient状态

       当我们new一个对象是,就是transient状态,最显著的特点是在数据库中没有与之对应的记录。也没有纳入到session 的管理,随时可以被垃圾回收处理掉,代码如下所示:

             /*             *  user是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的             *  缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象             *  user就变成了一个Persistent(持久化对象)             */            session=HibernateUtils.getSession();            tx=session.beginTransaction();            //Transient状态            User user=new User();            user.setName("丁国华");            user.setPassword("123");            user.setCreateTime(new Date());            user.setExpireTime(new Date());

       Persient状态

       当我们对transient 对象进行save(),saveOrUpdate()之后对象进入persient状态,在数据库中有与之对应的记录。纳入了session的管理,session和一级缓存绑定着,session级的缓存通常也叫一级缓存。当save()的时候会放到缓存里一份,可以理解为session里有个map,对象放到了map里面,有对象引用他了,垃圾回收机制是回收不了它的。调用delete(),进入Detached状态,代码如下所示:

            /*             *  user是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的             *  缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象             *  user就变成了一个Persistent(持久化对象)             */                  session=HibernateUtils.getSession();            tx=session.beginTransaction();            //Transient状态            User user=new User();            user.setName("丁国华");            user.setPassword("123");            user.setCreateTime(new Date());            user.setExpireTime(new Date());                    //Persistent状态            session.save(user);

       Detached状态

       当persient对象经过 evict(),close(),clear()方法处理,进入游离态也就是detached状态。detached对象之是将缓存里的记录清理了,数据库里的记录并没清理,没有纳入session管理,随时可以被垃圾回收掉。没有对象引用他~。因为在数据库里有引用记录没清理,所以可以调用update(),saveOrUpdate(),lock()等方法,调方法之后又回到transient状态,代码如下所示:

          /*             *  以上user就是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的             *  缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象             *  user就变成了一个Persistent(持久化对象)             */              Session session=null;        Transaction     tx=null;                try {            session=HibernateUtils.getSession();            tx=session.beginTransaction();            //Transient状态            User user=new User();            user.setName("丁国华");            user.setPassword("123");            user.setCreateTime(new Date());            user.setExpireTime(new Date());                             //Persistent状态            session.save(user);                        //进行修改操作,修改name=“等一个故事”            user.setName("等一个故事");            //提交事务            tx.commit();                    } catch (Exception e) {            e.printStackTrace();            if (tx != null) {                tx.rollback();            }        } finally{                        HibernateUtils.closeSession(session);        }                //detached状态           
       小编寄语:该博文小编主要简单的介绍了持久化对象的三种状态,举个生活的例子,我们可以把数据库比如成,我们常用的onenote,在我们的学习过程中,我们把重要的知识点,记录到onenote当中,更好的编织知识网,更加有利于提高学习效率,还没有被我记录到onenote里的知识点,处于一个游离的状态,把知识点记录到onenote中,这个过程就是持久化。瞬态数据和游离态数据非常的类似,但是有一点,就是她是存在持久化之前的数据,就是说,零散的知识点,还没有被我写进onenote的时候,知识点是瞬态的,记录到onenote中的时候就是持久态,用到的时候查询就是游离态。小编浅浅的理解,有不同意见的小伙伴,可以在下面进行留言,SSH之旅,未完待续......

1 0
原创粉丝点击