找了下网上的资料,恁是被说的稀里糊涂的。
捋了半天,不知道这样的理解是否正确。。。。。。
就是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的内存!