[转载]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或者是其他的应用程序看到的仍然还是数据库以前的数据。(可以试验)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值