此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
楼主【thebye85】截止到2008-06-23 23:09:51的历史汇总数据(不包括此帖):
发帖数:2                  发帖分:70                 
结贴数:2                  结贴分:70                 
未结数:0                  未结分:0                  
结贴率:100.00%            结分率:100.00%            
敬礼!

解决方案 »

  1.   

    关于你的这种说法,我不确定。
    关于flush,你可以看看下面这篇文章,或有帮助。
    http://blog.csdn.net/noove_001/archive/2007/10/26/1844537.aspx
      

  2.   

    当应用save或者update一个对象时,Hibernate并未将这个对象实际的写入数据库中,而仅仅是在缓存中根据应用的行为做了登记,在真正需要将缓存中的数据flush入数据库时才执行先前登记的所有行为。所以楼主可以按照你说的那样理解!
      

  3.   

    flush的作用就是将session管理的内存对象进行持久化,也就是执行SQL语句,也就是在逻辑上与数据库同步。在使用hibernate的时候你总会听到脏数据、脏检查这样的术语吧,那么flush就是进行脏检查,然后与持久层同步。至于什么时候执行数据库的commit,其实跟flush不应该放到一起讨论,因为他们基本没什么可比性,一个是应用程序逻辑上的,一个是数据库的操作。楼主的理解在物理实现是正确的,但是个人觉得不建议那样理解。还有,楼主如果还不确定什么时候执行数据库的commit操作,那么可以在flush和commit之间让程序空循环一段时间(比如十分钟),在这期间查看数据库的内容,这样就一目了然了
      

  4.   

    【转】http://www.cnblogs.com/skyqidao/archive/2007/12/23/1011533.html 还不错在下面的情况下,Hibernate会调用Session.flush()以清理缓存:
         1)事务提交时,如果flush模式不为FlushMode.NEVER,commit()将调用flush().
         2)在某些查询语句之前(此查询语句之前的语句已经改变了数据库状态,所以需要调用flush()以同步数据库是查出来的数据是经过更改的)。
    在调用Session.flush()时,涉及的SQL语句会按照下面的顺序执行。
    (1)         所有的实体经行插入的语句,其顺序按照对象执行Session.save()的时间顺序。
    (2)         所有对实体经行更新的语句
    (3)         所有经行集合的删除语句
    (4)         所有对集合元素进行删除,更新或者插入的语句
    (5)         所有经行集合插入的语句
    (6)         所有对实体经行删除的语句,其顺序按照对象执行Session.delete()的时间顺序。
    (7)         有一个例外是,如果对象使用native方式生成的ID(持久化标识),则他们一执行save就会被插入。
    除非明确地指定了flush()命令,否则关于Session何时会执行这些JDBC调用完全是无法保证的,只能保证他们执行的前后顺序。
    通过设置session.setFlushMode(),可以精确控制Hibernate的FlushMode.
    (1)                FlushMode.AUTO:Hibernate判断对象属性有没有改变,如果被更改成为脏数据,则在一个查询语句钱将更新此改动以保证数据库的同步。这也是Hibernate的默认清理模式。
    (2)              FlushMode.COMMIT:在事务结束之前清理session的缓存。这样有可能导致查出脏数据
    (3)                FlushMode.NEVER:除非强制调用Session.flush(),否则永远不清理Session。想当于将数据库设置为一个只读的数据库。
    (4)                FlushMode.ALWAYS:在每一个查询数据之前都调用Session.flush()。很显然这种效率很低。
         只用当使用触发器,或把Hibernate和JDBC混合使用,直接调用Session.flush()才是有意义的。 
      

  5.   

    楼上的同志们说的都挺好了,我再补充一下要看你的hibernate中的hibernate.connection.autocommit的设置如果设置成true的话,当你的不主动的声明事务,然后主动提交事务的话,那么你用flush,保存液不会生效,必须显示的写提交事务的代码如果设置成false的话,当你的不声明事务,执行完save时候,数据也不会保存到数据库,只要你执行flush后,才会执行自动提交事务,数据会保存到数据库中
      

  6.   


    晕,写了一大堆,发现写反了 ,要看你的hibernate中的hibernate.connection.autocommit的设置如果设置成false的话,当你不主动的声明事务,然后主动提交事务的话,那么你用flush,保存不会生效,必须显示的写提交事务的代码如果设置成true的话,当你不声明事务,执行完save时候,数据不会保存到数据库,只要你执行flush后,才会执行自动提交事务,数据会保存到数据库中
      

  7.   

      对那些需要按你要求的顺序执行SQL语句的时候就用flush(),执行一次flush()也就打印一次SQL,而不用flush(),则是你commit提交的时候一起打印
      

  8.   

    这个用处是最多的了
    ================================
    你首先要理解commit和flush区别在哪里
    这对你理解flush又很大的帮助一般我用于一大段代码的执行用commit
    而一些小当量的则用flush
    这是看个人感觉的*@!#……¥(@……#(@commit是事务,当中一步出错则全部返回
    你用flush的话,就是一步一步做,而不是一次性,如果当中有一步出错,则是执行到哪一步停止
    你可以这样理解
    不过
    flush会出错么???
    除非手动更改数据库,不然不会出错的把
      

  9.   


    第二条,我测试还是不能提交,不解。以下是测试代码:
    数据库表是innodb类型System.out.println(session.connection().getAutoCommit()); //false
    Student stu = new Student();
    stu.setName("111");
    session.save(stu);
    session.flush();
    session.close();
      

  10.   

    SQL语句能打印,报什么错误?
      

  11.   

    楼主,你System.out.println(session.connection().getAutoCommit()); //false
    这里都false了,当然不能提交我后来更正了呀,请再仔细看看我说的,如下 ,开始我给说反了如果设置成false的话,当你不主动的声明事务主动提交事务的话,你用flush,保存不会生效,必须显示的写提交事务的代码如果设置成true的话,当你不声明事务,执行完save时候,数据不会保存到数据库,只要你执行flush后,才会执行自动提交事务,数据会保存到数据库中
    把hibernate.connection.autocommit设置成true,就可以了
      

  12.   


    能举个例子吗?我的理解是:
    Transaction transaction = session.beginTransaction();
    Student stu = new Student();
    stu.setName("111");
    //保存操作
    session.save(stu);
    //更新操作
    stu.setName("222");
    session.update(stu); //不加flush(),控制台依次打印insert和delete语句,不执行update。
    //加flush(),控制台依次打印insert、update和delete语句,"按自己要求的顺序执行SQL语句"。
    session.flush();//delete操作
    session.delete(stu);
    transaction.commit();
    session.close();
      

  13.   

    我举个例子,
    比如 2张表 是一个主从关系,  主表包含 ID,ID1,ID2 就是所谓的一个联合主键 ,子表也有主表(mainId)的这3个主键作为外键。
    这个时候我想修改主表的主键之一就是ID2,但是这个时候我子表(minId)关联到了主表,只修改主表肯定不行,修改子表也不行,所以同时修改,这个时候一个先后顺序执行的要求就体现出来了,就是先更新子表,再更新主表,然后统一提交,2个操作算做一个事物进行处理代码: session.update(minId);
     session.flush;
     session.update(mainId);
     session.flush;
     transaction.commit();如果你这么写
     session.update(minId);
     session.update(mainId);
     transaction.commit();
    程序就会报并没有相关关键主键session.flush; 也就是在缓存里面预执行,这是我在实际应用中的理解,如果有错误的地方欢迎指教不过顺带提一句,这么写还要设置一下数据库的Deferrable属性,就是commit 提交的时候再检查主外键关联情况,不让上面代码会报数据库错误的
      

  14.   

    (1)        所有的实体经行插入的语句,其顺序按照对象执行Session.save()的时间顺序。 
    (2)        所有对实体经行更新的语句 
    (3)        所有经行集合的删除语句 
    (4)        所有对集合元素进行删除,更新或者插入的语句 
    (5)        所有经行集合插入的语句 
    (6)        所有对实体经行删除的语句,其顺序按照对象执行Session.delete()的时间顺序。 
    (7)        有一个例外是,如果对象使用native方式生成的ID(持久化标识),则他们一执行save就会被插入。