租房网站那些地图区域统计怎么做的,傻瓜式建站平台,宣讲家网站两学一做心得体会,桥头仿做网站2019独角兽企业重金招聘Python工程师标准 一、Clear 方法 无论是Load 还是 Get 都会首先查找缓存#xff08;一级缓存#xff09; 如果没有#xff0c;才会去数据库查找#xff0c;调用Clear() 方法#xff0c;可以强制清除Session缓存。例#xff1a; pub… 2019独角兽企业重金招聘Python工程师标准 一、Clear 方法 无论是Load 还是 Get 都会首先查找缓存一级缓存 如果没有才会去数据库查找调用Clear() 方法可以强制清除Session缓存。例 public void testClear()
{ Session session HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Teacher t (Teacher) session.get(Teacher.class, 3); System.out.println(t.getName()); session.clear();//这里不clear只会执行一次sql语句有clear会执行2次 Teacher t2 (Teacher) session.get(Teacher.class, 3); System.out.println(t2.getName()); session.getTransaction().commit(); 10.}
} 二、Flush 方法 可以强制进行从内存到数据库的同步。例 public void testFlush(){ Session session HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Teacher t (Teacher) session.get(Teacher.class, 3); t.setName(yyy); session.flush();//有flush会执行2次UPDAE,没有会只执行一次 t.setName(yyyyy); session.getTransaction().commit();
} Flush方法是可以设置的也就是 fulsh 什么时候执行是可以设置的在session.beginTransaction 前设置 FlushMode session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL); 这里 FlushMode 有 5 个值可选 Always: 任何代码都会 Flush AUTO: 默认方式 – 自动 Commit: COMMIT 时 Never: 始终不 MANUAL: 手动方式 设置 FlushMode 有个好处是可以节省开销比如默认 session 只做查询时就可以不让他与数据库同步了。 三、Evict 方法 会把指定的缓冲对象进行清除而 Clear 方法则是把缓冲区内的全部对象清除但不包括操作中的对象。 注意事项 Flush 方法和 Evict 方法一起使用出现的问题 Flush 方法和 Evict 方法一起使用出现的时候一定要注意使用的顺序否知会出现异常。下面的代码就是正确的使用顺序 //因为user的主键生成策略采用的是uuid所以调用完成save后
//只是将user纳入到了session的管理
//不会发出insert语句但是id已经生成session中existsInDatebase状态为false
session.save(user);
//flush后hibernate会清理缓存会将user对象保存到数据库中
//强制更新数据库结果但不一定因为commit时候可能会出现事物回滚
//并且设置session中existsInDatebase的状态为true
session.flush();
//将user对象从session中逐出即session的EntityEntries属性中逐出
session.evict(user);
//可以成功提交因为hibernate在清理缓存时
//在session的insertions集合中无法找到user对象
//所以就不会发出insert语句也不会更新session中的existsInDatabase的状态
tx.commit(); 转载于:https://my.oschina.net/airship/blog/1517982