Hibernate flush问题

ben0759 2009-03-31 12:26:15
在hibernate清除session数据到数据库的时候,有3种方法:
事务commit的时候;
数据get()出来之前;
还有调用session.flush()的时候;

但是我的程序只有事务commit的时候才可以,其他都无效,大家有没有出现这样的情况?有什么办法修改吗?是什么原因?
...全文
1012 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
JoSen__ 2012-07-17
  • 打赏
  • 举报
回复
你SET完后数据库没更新。
yangylsky 2009-06-12
  • 打赏
  • 举报
回复
mysql有4种事务隔离级别
1.Read Uncommitted 未提交读(hibernate在未提交事物之前数据库可以看到记录,也就是所谓的脏读)
2.Read committed 提交读(hibernate在未提交事物之前数据库不可以看到记录)
3.Repeatable Read 重复读(如果某条数据在处于读的状态时候不允许修改,但是数据又有添加则可以读出来)
4.serializalbe 序列化读(以上状态都不允许,只能被一个人读,在这个状态中不允许修改添加)

默认是Repeatable Read,用select @@tx_isolation 可看到,在my.ini里加入参数transaction_isolation=READ-UNCOMMITTED,这样就可以看到中间结果了

如果hibernate session的flushmode是AUTO,则当create一个数据时会自动flush到数据库,当update一个db里有的数据时,必须手动调用session的flush或者用dao get一次该数据时,更改才会flush到db里,否则即使隔离级别为READ-UNCOMMITTED也看不到
爱的世界999 2009-04-03
  • 打赏
  • 举报
回复
不执行flush()方法的时候,Hibernate 清理缓存,发出hql,其实这时候数据库已经有数据,只是由于数据库本身的隔离级别的问题,一般数据库都默认看不到的,必须等commit()以后才可以看到,可以通过设置隔离级别,看到数据;

--> 你在后台设置隔离级别的为 未提交读,既可以看到你flush过的数据
--> 我用的是mysql数据库 设置隔离级别是

mysql> select @@tx_isolation;(查看隔离级别)
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+

mysql> set transaction isolation level read uncommitted;(设置隔离级别为 未提交读)
Query OK, 0 rows affected

mysql> select @@tx_isolation;(查看隔离级别)

+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+

然后 你再select你的数据 即可看到!






ben0759 2009-04-03
  • 打赏
  • 举报
回复
非常奇怪。
ben0759 2009-04-03
  • 打赏
  • 举报
回复
非常感觉楼上的回答。
licip 2009-04-02
  • 打赏
  • 举报
回复
这没有提交吧.
ben0759 2009-04-02
  • 打赏
  • 举报
回复


Session session=HibernateSessionFactory.getSessionFactory().openSession();
Reward r=new Reward();
t.begin();
r=(Reward)session.load(Reward.class, "402881e720468f880120468f8b760001");
r.setName="aa";
session.flush();




为什么这样不行?
ben0759 2009-04-02
  • 打赏
  • 举报
回复


Session session=HibernateSessionFactory.getSessionFactory().openSession();
Reward r=new Reward();
t.begin();
r=(Reward)session.load(Reward.class, "402881e720468f880120468f8b760001");
r.setName="aa";
session.flush();




为什么这样不行?
jsyz3838131 2009-04-02
  • 打赏
  • 举报
回复
按这个应该可以呀 怪了 关注
ben0759 2009-04-02
  • 打赏
  • 举报
回复
但是我的对象是持久化的啊,不需要提交吧?
jsyz3838131 2009-04-01
  • 打赏
  • 举报
回复
不清楚你的问题,看看代码才好,执行flush()方法的时候,Hibernate 清理缓存,发出hql,其实这时候数据库已经有数据,只是由于数据库本身的隔离级别的问题,一般数据库都默认看不到的,必须等commit()以后才可以看到,可以通过设置隔离级别,看到数据,但这是不安全的,有可能回滚的数据
ben0759 2009-04-01
  • 打赏
  • 举报
回复
没人回?
liguangwen86 2009-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 despotic 的回复:]
flush是强行清除session缓存,不会提交事务,数据要持久化必须要commit。
[/Quote]顶
ben0759 2009-04-01
  • 打赏
  • 举报
回复
despotic 2009-03-31
  • 打赏
  • 举报
回复
flush是强行清除session缓存,不会提交事务,数据要持久化必须要commit。
ben0759 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liujinfengliuyi 的回复:]
楼上 所言极是

flush 是强制 清理缓存 强制同步
并不会 提交事务
必须 你commit
[/Quote]

我没有想提交事务,我想把之前修改的数据写入数据库,这样用flush应该是可以的吧、
热烈的红颜 2009-03-31
  • 打赏
  • 举报
回复
楼上 所言极是

flush 是强制 清理缓存 强制同步
并不会 提交事务
必须 你commit

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧