open Session In View和过滤器配置

Posted Beyondづ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了open Session In View和过滤器配置相关的知识,希望对你有一定的参考价值。


Open Session In View模式的主要思想是:Web Request(浏览器请求)开始时,自动打开Session,当Web Request结束时,自动关闭Session。也就是说,Session的生命周期与页面请求保持同步。


 实现步骤:(分层架构)(web工程)

  1.entity层(实体层)

  2.dao层(数据访问层)

  3.util层(工具层)

  4.biz层(业务逻辑层)

  5.filter层(过滤器)

  6.进行过滤器在网站xml的配置

结构图如下:

 


 1.entity层


   《1》.进行封装字段,小配置书写。

 实体类:


 


 Emp.hbm.xml: 



2. dao层:


 


 3.util层(工具层)


 

package cn.hq.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

        //getCurrentSession()底层实现原理
        //ThreadLocal变量
        public static final ThreadLocal<Session> threadTL=new ThreadLocal<Session>();

       //我想直接调用一个方法,获取Session
       //定义一个sessionFactory对象
        private static SessionFactory factory;
        private static Configuration cfg;
        static{
            cfg=new Configuration().configure();
            factory=cfg.buildSessionFactory();
        }
        //提供一个静态方法
        public static Session currentSession(){
            Session session=threadTL.get();
            if(session==null){  //当前线程中没有session对象
                session=factory.openSession();
                threadTL.set(session);
            }
            return session;
            
        }
        //关闭session
        public static void closeSession(){
            //获取线程中的session
            Session session = threadTL.get();
            if (session!=null) {
                threadTL.set(null);
                session.close();
            }
        }
        
    }

4.biz层(业务逻辑层)


  


 5.filter层(过滤器)


 

@Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.currentSession();
            System.out.println("filter\\t"+session.hashCode());
            tx = session.beginTransaction();
            // 执行请求处理链
            chain.doFilter(request, response);
            // 返回响应时,提交事务
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
            tx.rollback();
        } finally {
            // 关闭session
            HibernateUtils.closeSession();
        }
        
    }

6.进行过滤器在网站xml的配置


web.xml进行配置:


index.jsp界面:


实现效果:


注意:(常见问题)

 

解决方案:

查看一下biz层是否开启事务以下界面:

如果是将其事务开启与提交进行注释。在这不用重复进行事务操作。


 

以上是关于open Session In View和过滤器配置的主要内容,如果未能解决你的问题,请参考以下文章

使用 Grails 时我应该关心 Open Session in View 吗?

ssh整合,从hibernate那个版本开始需要open session in view 才能开启事务?

Open Session In View OSIV - 每个请求/线程都会发生这种情况吗?

Spring boot 解决 hibernate no session异常

SpringBoot 使用JPA时解决no session的方法

去掉WARN spring.jpa.open-in-view is enabled by default