hibernate中session的flush()方法个人浅见

找了下网上的资料,恁是被说的稀里糊涂的。

捋了半天,不知道这样的理解是否正确。。。。。。

就是flush()方法就是为了保证在session的一级缓存中的数据与数据库中是一样的!而不是清空缓存。

Student student = (Student) session.get(Student.class, 5);
student.setName("456");
session.flush();
student.setName("789");
tx.commit();

在这里,首先是要从数据库中查询出指定的对象,就是这里的student。

控制台打印的是这些sql语句。然后student对象被放到session的一级缓存中。当执行了student.setName("456");这句后,session自己检测到当前的student对象的数据发生了改变,就会跟着去准备一句update语句了,只是作了准备,此时调用flush()方法,它只会更新当前session缓存中的student对象,不会影响到数据库中原有值。这时候可以这样来理解,既然我得要我session中的数据同数据库中的数据是一致的,那么我就先把自己的改好咯,然后再把更新的语句给数据库就行,最终达到的效果还是session我跟数据库中的该条数据是一致的卅。而把这个sql语句给到数据库的就是flush()方法了。flush()后,session中的数据还在。你能看见更新语句,都是flush()的功劳。

student.setName("789");----->它是flush后执行的语句;这个时候又会重复刚才的情景。session一看,哎哟,我去,数据又变了!如果搁这后面没有其改变数据的操作的话,在没有出现意外回滚的前提下,数据库中的数据绝逼就是这个了!那我session要跟数据库保持统一,肯定就要先跟新自己缓存中的数据咯,于是就做了更新的动作,并把这些更新动作对应的sql语句也准备好了,当然,这会儿你是看不见的。

好了,我session把自己的数据预先给处理好了,跟着就是commit()了,commit会隐式的调用flush()方法,所以你才能看见由session准备好的sql语句。不信的话,你可以把

Student student = (Student) session.get(Student.class, 5);
student.setName("456");
session.flush();
student.setName("789");
//tx.commit();
-
----》注释掉的话,就只能看见一条sql语句。

于是就有了第二条更新的sql语句

前一次不同的是,因为是commit(),最后通牒都来了,这一次session中的数据就是被清空了的。

所以综上,得出:

flush()方法值是同步数据,不会涉及清空session的内存!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值