4、Hibernate三种状态的讲解

Hibernate常见的三种状态的讲解:

Transient : 瞬时的状态,new出来的对象,即没有被持久化,也不存在Session缓存中,即没有被session管理。

Persistent:持久化的状态,数据库中有,并且也在session缓存中中。

Detached :离线状态,指的是,已经被持久化,既数据库中有;但是不在session范围中。

                一般是session.close(),session关闭了或者是session.clear(),session清空了缓存。

(1)由Transient 状态变为Persistent状态,save()或者update()方法

            User u = new User();
            u.setPassword("123");
            //以上u就是Transient(瞬时状态),表示没有被session管理并且数据库中没有
            //执行save之后,被session所管理,而且,数据库中已经存在,此时就是Persistent状态
            session.save(u);

(2)在Persistent状态,分析具体执行了几条的sql语句

            User u = new User();
            u.setNickname("赵晓七");//以上u就是Transient(瞬时状态),表示没有被session管理并且数据库中没有
            //执行save之后,被session所管理,而且,数据库中已经存在,此时就是Persistent状态
            session.save(u);
            //此时u是持久化状态,已经被session所管理,当在提交时,会把session中的对象和目前的对象进行比较
            //如果两个对象中的值不一致就会继续发出相应的sql语句
            u.setNickname("赵晓其");
            //此时会发出2条sql,一条用户做插入,一条用来做更新

(3)在Persistent状态下,执行session.update()的方法,session.save(u),是没有意义的语句,

     原因在于在Persistent状态下,如果u这个对象和session中的对象不一致,会发出sql语句完成更新。

                                       不需要手动的调用session.update()或者session.save().

           

User u = new User(); u.setBorn(sdf.parse("1976-2-3")); u.setUsername("zxq"); u.setNickname("赵晓八"); u.setPassword("123"); session.save(u); u.setPassword("222"); //该条语句没有意义 session.save(u); u.setNickname("赵晓吧"); //没有意义 session.update(u); u.setBorn(sdf.parse("1988-12-22")); //没有意义 session.update(u);

(4)session.load(User.class,id),也会把一个Transient 状态,变为Persistent状态。

           //此时u是Persistent
            User u = (User)session.load(User.class, 10);
            //由于u这个对象和session中的对象不一致,所以会发出sql完成更新
            u.setUsername("aaa");

(5)session.clear(),清空session管理范围的对象

    

           //此时u是Persistent
            User u = (User)session.load(User.class, 11);
            u.setUsername("123");
            //清空session
            session.clear();

(6)

原文地址:https://www.cnblogs.com/zhangbaowei/p/4853431.html