通过Filter过滤器来实现OSIV模式

本文介绍了一种利用Servlet过滤器实现OpenSessionInView(OSIV)模式的方法,该模式有助于简化Hibernate会话管理,确保在整个请求周期内保持打开状态的会话。通过配置HibernateSessionFilter,可以在每个HTTP请求开始时开启一个新的Hibernate事务,并在请求结束时提交或回滚事务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Servlet过滤器来实现OSIV模式(Open Session In View 模式)

 

util中的代码,用于获得SessionFactory

package com.lbx.util;

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

public class HibernateSessionFactoryUtil {
	
	private static final SessionFactory sessionFactory ;
	
	private HibernateSessionFactoryUtil(){
		
	}
	
	static {
		try {
			sessionFactory = new Configuration().configure().buildSessionFactory();
		}catch(Throwable e){
			throw new ExceptionInInitializerError(e);
		}
	}
	
	public static SessionFactory getSessionFactory(){
		return sessionFactory;
	}
	
}

 

 

 

Servlet的Filter代码

package com.lbx.servlet;

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.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import com.lbx.util.HibernateSessionFactoryUtil;

/**
 * 使用Servlet过滤器来实现OSIV模式(Open Session In View 模式)
 * @author Administrator
 *
 */

public class HibernateSessionFilter implements Filter {

	private SessionFactory sessionFactory;
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		sessionFactory.close();
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		Transaction tx = null;
		try{
			Session session = sessionFactory.getCurrentSession();
			tx = session.beginTransaction();
			chain.doFilter(request, response);
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			try{
				if(tx.isActive()){
					tx.rollback();
				}
			}catch(Exception e2){
				e2.printStackTrace();
			}
		}
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		sessionFactory = HibernateSessionFactoryUtil.getSessionFactory();
	}

}

 

 

 

修改web.xml文件(配一个Filter)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  
  <filter>
  	<filter-name>hibernateSessionFactory</filter-name>
  	<filter-class>com.lbx.servlet.HibernateSessionFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>hibernateSessionFactory</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  
</web-app>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值