此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
楼主【thebye85】截止到2008-06-23 23:09:51的历史汇总数据(不包括此帖):
发帖数:2 发帖分:70
结贴数:2 结贴分:70
未结数:0 未结分:0
结贴率:100.00% 结分率:100.00%
敬礼!
楼主【thebye85】截止到2008-06-23 23:09:51的历史汇总数据(不包括此帖):
发帖数:2 发帖分:70
结贴数:2 结贴分:70
未结数:0 未结分:0
结贴率:100.00% 结分率:100.00%
敬礼!
解决方案 »
- 字符串过滤问题 哪位大牛给解决一下啊
- 有人用oracle存储过程么???????????????????
- java类如何向XML文件中传值,而XML文件由如何接收这个值来用
- 求救,哪位哥们帮忙解决一下,SSH整合的错误
- java定时任务求助
- 如何设置JTable中某一行的背景色
- webservice访问路径如何自定义设置?
- bean和客户端不在一个工程里,这样调用怎么不行呢?跪求。。。
- resin报告`' is an unknown error page.是怎么回事?
- 郑重承诺,由于时间要求较紧,java rmi的问题,我愿意再加100分,江湖救急大家帮忙了!!
- tomcat控制台输出的内容如何存到文件中?
- 求jtds-1.2.2.jar。。。。。
关于flush,你可以看看下面这篇文章,或有帮助。
http://blog.csdn.net/noove_001/archive/2007/10/26/1844537.aspx
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()才是有意义的。
晕,写了一大堆,发现写反了 ,要看你的hibernate中的hibernate.connection.autocommit的设置如果设置成false的话,当你不主动的声明事务,然后主动提交事务的话,那么你用flush,保存不会生效,必须显示的写提交事务的代码如果设置成true的话,当你不声明事务,执行完save时候,数据不会保存到数据库,只要你执行flush后,才会执行自动提交事务,数据会保存到数据库中
================================
你首先要理解commit和flush区别在哪里
这对你理解flush又很大的帮助一般我用于一大段代码的执行用commit
而一些小当量的则用flush
这是看个人感觉的*@!#……¥(@……#(@commit是事务,当中一步出错则全部返回
你用flush的话,就是一步一步做,而不是一次性,如果当中有一步出错,则是执行到哪一步停止
你可以这样理解
不过
flush会出错么???
除非手动更改数据库,不然不会出错的把
第二条,我测试还是不能提交,不解。以下是测试代码:
数据库表是innodb类型System.out.println(session.connection().getAutoCommit()); //false
Student stu = new Student();
stu.setName("111");
session.save(stu);
session.flush();
session.close();
这里都false了,当然不能提交我后来更正了呀,请再仔细看看我说的,如下 ,开始我给说反了如果设置成false的话,当你不主动的声明事务主动提交事务的话,你用flush,保存不会生效,必须显示的写提交事务的代码如果设置成true的话,当你不声明事务,执行完save时候,数据不会保存到数据库,只要你执行flush后,才会执行自动提交事务,数据会保存到数据库中
把hibernate.connection.autocommit设置成true,就可以了
能举个例子吗?我的理解是:
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();
比如 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 提交的时候再检查主外键关联情况,不让上面代码会报数据库错误的
(2) 所有对实体经行更新的语句
(3) 所有经行集合的删除语句
(4) 所有对集合元素进行删除,更新或者插入的语句
(5) 所有经行集合插入的语句
(6) 所有对实体经行删除的语句,其顺序按照对象执行Session.delete()的时间顺序。
(7) 有一个例外是,如果对象使用native方式生成的ID(持久化标识),则他们一执行save就会被插入。