session.flush()[转载]

本文探讨了Hibernate中Session缓存的工作原理及其如何避免重复访问数据库。通过示例代码展示了如何使用session.flush()来同步缓存与数据库,并讨论了在事务提交时自动执行flush的行为。此外还介绍了手动调用flush()的潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hibernate一个Session有一个Cache,cache屏蔽了应用程序直接去访问数据库,如果同一张table的同一row在先前已经被请求过,那么为何下次请求的时候还要去请求一次呢,把前面的cache住,再遇到这样的请求直接返回cache里边的即可。

cache里边的数据如果含有脏数据,需要跟数据库同步(也就是需要hibernate来发送update, delete, insert),调用session.flush()达到此目的。一般情况下,hibernate在一个tx.commit()的时候会自动调用session.flush();也可以应用程序手动调用session.flush()来立刻将session的脏数据提交。

[color=darkblue]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();[/color]


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或者是其他的应用程序看到的仍然还是数据库以前的数据。(可以试验)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值