1.flush
flush是Hibernate强制更新、将session与数据库同步的一种方法
请看以下代码
@Test
public void flush() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
User user=null;
user=(User) session.get(User.class, 1);
user.setUserName("jack");
session.flush();
user.setUserName("jack_new");
tx.commit();
session.close();
输出的结果是 Hibernate: update A set userName=? where userId=?
Hibernate: update A set userName=? where userId=?
说明数据库已经更新过两次,
而如果将 session.flush();删除,那么只会更新一次
这就是flush的作用
2.clear
clear是Hibernate一种强制清除所有session缓存的方法,
请看以下对比代码
2.1、这是没有clear方法的代码
public void clear() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
User user=null;
user=(User) session.get(User.class, 1);
user=(User) session.get(User.class, 1);
tx.commit();
session.close();
这里输出Hibernate: select user0_.userId as userId0_0_, user0_.userName as userName0_0_ from A user0_ where user0_.userId=?
只有一条查询结果
2.2、这是有clear方法的代码
public void clear() {
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
User user=null;
user=(User) session.get(User.class, 1);
session.clear();
user=(User) session.get(User.class, 1);
tx.commit();
session.close();
这里输出Hibernate: select user0_.userId as userId0_0_, user0_.userName as userName0_0_ from A user0_ where user0_.userId=?
Hibernate: select user0_.userId as userId0_0_, user0_.userName as userName0_0_ from A user0_ where user0_.userId=?
两条运算结果
结论:有clear清除了session一级缓存,那么红色部分的user获取只能从数据库中拿到,所以拿到两个结果(因为session的get方法会 先检查缓存中是否有数据,如果有不查询数据库,直接从缓存中获取)
但是2.1中的user获取是在同一个session缓存区中拿的,所以他们本来就是同一个缓存区域里的东西,所以输出来的只有一个结果。
总结:
缓存相关几个方法的作用
session.flush(); 让一级缓存与数据库同步
session.evict(arg0); 清空一级缓存中指定的对象
session.clear(); 清空一级缓存中缓存的所有对象