我的理解:flush()清理的是缓存中的语句,如执行一系列SQL语句,这是已经在缓存中中存在的。
而commit()方法提交的是一个事务,在执行这个事务前要先清理缓存中的语句。也就是说:flush()清理的是先前在缓存中还未处理完的语句;commit()提交的是当前的一个事务。"p148 所谓清理"这个清理有没特指哪个清理?

解决方案 »

  1.   

    出于性能的考虑, 一般一系列的语句,会累积起来, 最后commint时候一起执行,只要和数据库通讯一次. flush()则强迫它立即执行
      

  2.   

    出于性能的考虑, 一般一系列的语句,会累积起来, 最后commint时候一起执行,只要和数据库通讯一次. flush()则强迫它立即执行commit与flush的区别还是有点模糊。flush立即执行是否就会与数据库通讯了呢?还是要commit之后才提交到数据库然后操作才在数据库里产生作用??望赐教!!
      

  3.   

    flush当然是立即在数据库执行了
    否则就会到commit后再执行
      

  4.   

    大虾们我这样表面化的直观的理解对不对:可以每一个数据库操作后都加一个flush让hibernate立即执行;但一个事务中只能有一个commit提交事务操作.
      

  5.   

    flush()操作的是Hibernate的缓存,将Hibernate中缓存的数据提交到DB层,如果这时候DB处于事物当中,那是DB的事情,与Hibernate无关了,commit()是告诉DB我这个事物结束了,你可以将我刚刚提交给你的数据进行更新.
      

  6.   

    首先要说明一下的是Hibernate自身并不带有缓存。
    比如有一个POJO叫user,现在将这个对象的name属性改变了,这时Hibernate
    并不会立即对数据库进行操作,你可以继续对这个对象进行其它的操作;但如果此时你使用了Session.flush(),那么Hibernate就会将这个改变更新到数据库中。由flush引发的数据库更新操作是可以RollBack的,但一旦执行了Transaction的commit,则无法再RollBack了。Hibernate在返回一个POJO时,会另外自己“备份”一个,以便于在执行更新操作时能够通过Java的“动态代理”知道哪些字段被修改了哪些没有被修改。但这并不是什么缓存。
      

  7.   

    flush(),脏数据检查,使缓存与数据库同步
      

  8.   

    既然flush()已经同步更新数据库了,那也就意味着永久保存下来了
    ??