[转载]session.flush()

hibernate一个Session有一个Cache,cache屏蔽了应用程序直接去访问数据库,如果同一张table的同一row在先前已经被请求过,那么为何下次请求的时候还要去请求一次呢,把前面的cache住,再遇到这样的请求直接返回cache里边的即可。

cache 里边的数据如果含有脏数据,需要跟数据库同步(也就是需要hibernate来发送update, delete, insert),调用session.flush()达到此目的。一般情况下,hibernate在一个tx.commit()的时候会自动调用 session.flush();也可以应用程序手动调用session.flush()来立刻将session的脏数据提交。
Session session = HibernateSessionFactory.currentSession();
        Transaction tx = session.beginTransaction();
        try{
         Employee employee1 
= (Employee)session.load(Employee.class, new Integer(3));
         System.out.println(employee1);
         employee1.setAge((byte)98);
         session.flush();//发送employee1的update给数据库
//         employee1.setAge((byte)43);
         tx.commit();//employee1已经被flush过,不会再被flush。如果把上面以行代码注释取消,还会再发一条update语句。
        }
        catch(HibernateException e){
            e.printStackTrace()
;
            tx.rollback();
        }

         tx 
= session.beginTransaction();
        Employee employee2 = (Employee) session.load(Employee.class, new Integer(3));
        employee2.setGender('f');
        System.out.println(employee2);
        tx.commit();

session.flush()的动作执行的时候,session中cache不会被清空,所以上面的employee2和employee1返回的还是同一个实例。

那些被flush()过的对象不会在下次flush()的时候再被flush()一次,除非两次flush()中间又产生了新的脏数据。

我 认为应用程序基本上不需要显示去调用session.flush();而交给tx.commit()去做就可以了。原因是:手动调用 session.flush()虽然是往数据库提交了update等sql语句,但是这些update真正的commit是在tx.commit()执行 的时候。所以手动session.flush()后,其他的session或者是其他的应用程序看到的仍然还是数据库以前的数据。(可以试验)
阅读更多
个人分类: Hibernate
上一篇Hibernate的各种保存方式的区别
下一篇Ext研究(1)——关于Function类的一些新方法的使用
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭