【SSH】——Hibernate三种状态之间的转化

Hibernate的三种状态为:transient、persistent和detached。对这三种状态的理解可以结合Session缓存,在Session缓存中的状态为persistent,另外两种不在Session中。
另一种说法是,Hibernate有四种状态,增加一个removed状态。在一个session实例的缓存中删除时会转化到该状态。

  1. transient
    通过new()创建,不在session的缓存中,也与数据库无关的状态。处在该状态的对象称为临时对象。

  2. persistent
    对象在session缓存区中,数据库中有数据与之对应。

  3. detached
    俗称游离状态,即存在于数据库中,但session中已经不存在该对象。

Hibernate三种状态之间的转化

上图是其三种状态之间的转化,下面我们通过实例来具体看一下。

1、开始——>transient

private static SessionFactory factory;
    /**
     * 完成sessionFactory的初始化
     */
    static{
        try{
            //读取hibernate.cfg.xml配置文件
            Configuration cfg=new Configuration().configure();

            //建立sessionFactory,可访问mysql
             factory=cfg.buildSessionFactory();

        }catch(Exception e){
            e.printStackTrace();
        }finally{

        }

    }

    //获得session
    public static Session getSession(){
        return factory.openSession();
    }

获取session对象

            //获取session对象
            session = HibernateUtil.getSession();
            // 开启
            ts = session.beginTransaction();

            // Transient状态
            user = new User();
            user.setName("张三");
            user.setPassword("1233");
            user.setCreateTime(new Date());
            user.setExpireTime(new Date());

执行new()方法之后,对象进入transient状态。对照上图也可以看出,如果接下来不对其进行操作,该对象最终会被垃圾回收,不再是transient状态。
那么接下来,我们对其执行简单的save()操作。

2、transient——>persistent

          // 执行过后,被session管理 Persistent
            session.save(user);

            //修改用户姓名
            user.setName("张四");

         //commit会把数据与数据库进行同步。 
            ts.commit();

3、persistent——>detached

关闭session,对象状态由持久化转为游离态。

if(session!=null){
            if(session.isOpen()){
                session.close();
            }
        }

4、detached——>persistent

这里,我们通过update()方法实现。

           //再次修改用户名
           user.setName("张五");
           //获取session对象,与上面类似      
           session = HibernateUtil.getSession();
            // 开启
            ts = session.beginTransaction();

            // 将session管理
            // 变为persistent状态,清理缓存时同步数据库。
            session.update(user);
            session.getTransaction().commit();

了解Hibernate中对象的三种状态,可以帮助我们对其进行灵活的操作。也可以帮助我们理解他与session缓存、数据库之间的关联。

原文地址:https://www.cnblogs.com/saixing/p/6730246.html