Hibernate中sessoin的flush学习笔记
时间:2010-10-09 来源:lxy_em30
一、session flush方法主要做了两件事:
1、清理缓存; 2、执行sql。 二、session在什么情况下执行flush 1、 默认在事务提交时; 2、 显示的调用flush。 三、当主键生成方式不同时,flush调用的时刻也不同。 1、当主键的生成方式是uuid时: 调用完save()后,只是将save的对象纳入到了session的管理,不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false(也就是说,此时数据库中并不存在所save的对象);如果此时调用session.flush()方法,那么Hibernate会清除缓存,执行相关的sql语句,则此时数据已经在数据库中存在了,且如果数据库的隔离级别设置成“未提交读”时,我们应该可以在数据库中读到相关的数据记录(此时的数据仍然可以“回滚”),显然,session中existsInDatebase状态将更改为true;如果transaction.commit()方法被调用,在默认会调用session.flush()方法,同时,此时数据库中的数据不能“回滚”。 2、当主键的生成方式为native时: 调用完save()后,将save的对象纳入到了session的管理,发出insert语句,并返回有数据库生成的id,修改了session中existsInDatebase状态为true,如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据,这种情况下,显示的调用session.flush()方法,已经显的多余了,因为在后面的transaction.commit()方法被调用时,会隐式的调用session.flush()方法。 3、当主键的生成方式为assigned时: 调用完save()后,将save的对象纳入到了session的管理,不会发出insert语句,而此时的主键已经由我们手动分配了,于是,显示的调用session.flush()方法,能起到主键生成方式为uuid时的效果。 四、我需要注意的是:hibernate默认是按照save(insert),update、delete顺序提交相关操作的,所以,如果我们想要按照自己的意愿去进行相关的操作,那么我们可以用显示的调用session.flush()来实现我们的愿望。 相关阅读 更多 +