zoukankan      html  css  js  c++  java
  • 深入hibernate的三种状态

    学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别,比如瞬时状态就是刚new出来一个对象,还没有被保存到数据库中,持久化状态就是已经被保存到数据库中,离线状态就是数据库中有,但是session中不存在该对象。但是大家又是否对hibernate的session的那几个特殊方法一清二楚呢?或者说大家是否能够一眼就快速看出一个测试用例在反复的调用session的诸如save,update方法后会到底发出多少条SQL语句呢?本篇随笔将会给你答案,本篇随笔将会以大量的测试用例来掩饰hibernate的这三种状态的转变,相信看完本篇随笔的你会对hibernate的那三种状态有更深入的理解。

    好了,废话不多说了,相信大家都知道hibernate的这三种状态的含义,那我们就通过一张图来开始我们的深入hibernate的三种状态之旅吧。

    1、TestTransient

               session = HibernateUtil.openSession();
                session.beginTransaction();
                User user = new User();
                user.setUsername("aaa");
                user.setPassword("aaa");
                user.setBorn(new Date());
                /*
                 *  以上user就是一个Transient(瞬时状态),此时user并没有被session进行托管,即在session的
                 *  缓存中还不存在user这个对象,当执行完save方法后,此时user被session托管,并且数据库中存在了该对象
                 *  user就变成了一个Persistent(持久化对象)
                 */
                session.save(user);
                session.getTransaction().commit();

     此时我们知道hibernate会发出一条insert的语句,执行完save方法后,该user对象就变成了持久化的对象了

    Hibernate: insert into t_user (born, password, username) values (?, ?, ?)

    2.TestPersistent01

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

    在调用了save方法后,此时user已经是持久化对象了,被保存在了session缓存当中,这时user又重新修改了属性值,那么在提交事务时,此时hibernate对象就会拿当前这个user对象和保存在session缓存中的user对象进行比较,如果两个对象相同,则不会发送update语句,否则,如果两个对象不同,则会发出update语句。

    Hibernate: insert into t_user (born, password, username) values (?, ?, ?)
    Hibernate: update t_user set born=?, password=?, username=? where id=?

    3.TestPersistent02

               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                session = HibernateUtil.openSession();
                session.beginTransaction();
                User u = new User();
                u.setBorn(new Date());
                u.setUsername("zhangsan");
                u.setPassword("zhangsan");
                session.save(u);
                u.setPassword("222");
                //该条语句没有意义
                session.save(u);
                u.setPassword("zhangsan111");
                //没有意义
                session.update(u);
                u.setBorn(sdf.parse("1988-12-22"));
                //没有意义
                session.update(u);
                session.getTransaction().commit();

    这个时候会发出多少sql语句呢?还是同样的道理,在调用save方法后,u此时已经是持久化对象了,记住一点:如果一个对象以及是持久化状态了,那么此时对该对象进行各种修改,或者调用多次update、save方法时,hibernate都不会发送sql语句,只有当事物提交的时候,此时hibernate才会拿当前这个对象与之前保存在session中的持久化对象进行比较,如果不相同就发送一条update的sql语句,否则就不会发送update语句

      

  • 相关阅读:
    机器学习作业12--朴素贝叶斯-垃圾邮件分类
    机器学习作业11--分类与监督学习,朴素贝叶斯分类算法
    机器学习作业9--主成分分析
    机器学习作业8--特征选择
    机器学习作业7--逻辑回归实践
    机器学习作业6--逻辑回归
    实验五 单元测试
    实验二 结对编程 第二阶段
    实验二 结对编程第一阶段
    实验一 GIT代码版本管理
  • 原文地址:https://www.cnblogs.com/gulj/p/5212920.html
Copyright © 2011-2022 走看看