Hibernate事务的高级应用
来源:互联网 发布:高斯键盘知乎 编辑:程序博客网 时间:2024/04/30 11:17
第一步:创建静态成员
在HibernateUtil类中我们需要定义一个静态的成员变量用于保存当前线程共用的Session :
private static ThreadLocal<Session>sessionLocal = newThreadLocal<Session>();
第二步:修改获取session的方法
改造HibernateUtil类的获取Session方法:
/** * @return获取当前线程容器中的SESSION */ public static Session getThreadLocalSession() { // 获取当前线程中的SESSION Session s = sessionLocal.get(); if (s == null) { // 如果为空,则新建一个SESSION s = getSessionFactory().getCurrentSession (); // 需要将新的SESSION放入到当前线程容器中 sessionLocal.set(s); } return s; }
第三步:配置Hibernate.cfg.xml
在Hibernate.cfg.xml文件中添加配置:
<propertyname="current_session_context_class">thread</property>
第四步:添加监听器
添加OpenSessionInViewFilter过滤器:
public void doFilter(ServletRequest request, ServletResponseresponse, FilterChain filterChain) throws IOException, ServletException { Session s =HibernateUtil.getThreadLocalSession(); Transaction t = null; try { // 开始事务 t = s.beginTransaction(); // 进入一系列的过滤链,处理相应的ACTION、业务逻辑及数据层 filterChain.doFilter(request, response); // 提交事务 t.commit(); } catch (Exceptione) { if (t != null) t.rollback(); throw new RuntimeException(e.getMessage(), e); } finally { HibernateUtil.closeSession(); }}
第五步:在web.xml中配置filter
关于getCurrentSession()方法:
sessionFactory.getCurrentSession()可以完成一系列的工作,当调用时,
hibernate将session绑定到当前线程,事务结束后,hibernate
将session从当前线程中释放,并且关闭session。当再次调用getCurrentSession
()时,将得到一个新的session,并重新开始这一系列工作。
这样调用方法如下:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
getCurrentSession和openSession的区别:
- getCurrentSession创建的session会和绑定到当前线程,而openSession不会。
- getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭
添加HibernateUtil类中清除线程容器Session的方法:(这个方法是使用openSession创建session时使用的)
/** * 关闭当前线程容器中的SESSION */ public static void closeSession() { Session s = sessionLocal.get(); if (s != null) { // 清除当前线程容器中的SESSION sessionLocal.set(null); } }
- Hibernate事务的高级应用
- Hibernate 的JTA事务的应用
- 【Hibernate系列】(二):事务的应用
- Hibernate 3.x过滤器的高级应用
- 14、Hibernate高级应用
- hibernate高级应用
- MySQL高级十——事务的应用
- c#事务、using释放资源、实体类的高级应用
- 事务隔离机制(hibernate 应用)
- 事务隔离机制(hibernate 应用)
- 小贝_redis 高级应用-事务
- Hibernate的事务
- Hibernate的事务提交
- Hibernate的数据库事务
- Hibernate的事务控制
- hibernate的事务
- Hibernate的事务注意事项
- Hibernate事务的属性
- 使用_TrackMouseEvent捕获WM_MOUSELEAVE和WM_MOUSEHOVER消息
- 谁是最好的Coder
- opengl编程指南
- 【JavaWeb】画验证码图片
- Activity 启动模式
- Hibernate事务的高级应用
- 查询redo logfile的使用率 tablespace 的自由空间
- 2012-10-29
- Easui中datagrid实现动态控制columns
- Redis学习笔记0--redis.conf配置项说明
- Hiberanate的拦截器和监听事件
- C++服务器的push推送通知的代码,SSL链接
- 求一个Vb.net 2005导出Excel 的类
- VC调试无法加断点,代码版本不一致的解决方法