[原创]自定义OpenSessionInView的实现_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
3
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3656 | 回复: 2   主题: [原创]自定义OpenSessionInView的实现        下一篇 
FDY1
注册用户
等级:网站编辑
经验:436455203
发帖:23
精华:2
注册:2013-3-6
状态:离线
发送短消息息给FDY1 加好友    发送短消息息给FDY1 发消息
发表于: IP:您无权察看 2013-3-6 16:22:08 | [全部帖] [楼主帖] 楼主

在hibernate中,由于hibernate有懒加载的问题,当没有调用到指定对象的值时,sql语句并未发出,这时当结果   返回到页面,页面从对象中取值。而此时连接已经关闭,也取不到对象的值,所以这时可以使用filter来解决这一问题.
  当然了,filter也有配置的顺序问题.这个filter必须配置在最外层,也就是struts的filter的外围才能正常工作,所以
请看如下代码.

package com.fdy.oa.web;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.fdy.oa.utils.HibernateUtils;
public class SessionFilter implements Filter {
      public void init(FilterConfig arg0) throws ServletException {
            try {
                  Class.forName("com.fdy.oa.utils.HibernateUtils");// 类加载时就加载了配置文件.
            } catch (ClassNotFoundException e) {
                  e.printStackTrace();
            }
      }
      public void destroy() {
      }
      public void doFilter(ServletRequest req, ServletResponse res,
      FilterChain chain) throws IOException, ServletException {
            Session session = null;
            try {
                  session = HibernateUtils.getSession();// 取到当前线程的session.
                  Transaction tx = session.beginTransaction();
                  chain.doFilter(req, res);
                  tx.commit();
            } catch (HibernateException e) {
                  session.beginTransaction().rollback();
                  e.printStackTrace();
            } finally {
            HibernateUtils.close();// 多线程条件下,如果不把session放入threadlocal中,你所操作的session可能不是之前的session.
      }
}
}


在这段代码中,session在filter中进行关闭,这样就保证jsp页面能取到对应的值.
再来看其中调用的hibernateutils的代码,可以看出来,session是被放在了threadlocal中,threadlocal保证每一个线程有一个副本,而不用考虑同步的问题.这也很好的解决了session的值不互相干扰的问题.

package com.fdy.oa.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
      private static Configuration cfg;
      private static SessionFactory factory;
      private static ThreadLocal<Session> local;
      static {
            cfg = new Configuration().configure("hibernate_mysql.cfg.xml");
            factory = cfg.buildSessionFactory();
            local = new ThreadLocal<Session>();
      }
      public static Session getSession() {
            if (local.get() == null) {
                  local.set(factory.openSession());
            }
            return local.get();
      }
      public static void close() {
            if (local.get() != null && local.get().isOpen()) {
                  local.get().close();
                  local.set(null);
            }
      }
}


现在请各位自己动手尝试一下!感受一下自建sessionfilter而不是用spring的OpenSessionInView的方法.




赞(0)    操作        顶端 
FDY1
注册用户
等级:网站编辑
经验:436455203
发帖:23
精华:2
注册:2013-3-6
状态:离线
发送短消息息给FDY1 加好友    发送短消息息给FDY1 发消息
发表于: IP:您无权察看 2013-3-6 16:23:35 | [全部帖] [楼主帖] 2  楼

楼主好厉害哦!



赞(0)    操作        顶端 
FDY1
注册用户
等级:网站编辑
经验:436455203
发帖:23
精华:2
注册:2013-3-6
状态:离线
发送短消息息给FDY1 加好友    发送短消息息给FDY1 发消息
发表于: IP:您无权察看 2013-3-6 16:24:25 | [全部帖] [楼主帖] 3  楼



赞(0)    操作        顶端 
总帖数
3
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论