最近做一个公司项目的Demo,使用技术为jsp+dwr+hibernate,因为该Demo中所用的表多,有一对一,一对多和多对一的关系,所以利用hibernate的延迟加载(lazy="true")对性能的提高相当重要,但随之带来的session管理更为重要,弄不好常出现延迟加载异常,在这里我利用了Filter 来处理session的close的,相关代码如下:
1.HibernateSessionFactory.java(Eclipse自动生成,通过ThreadLocal
将session的非线程安全变成安全)
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
public class HibernateSessionFactory {
private static final Logger log = Logger.getLogger(SessionFactory.class) ;
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
static {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
log.error(" error creating sessionFactory") ;
e.printStackTrace();
}
}
public HibernateSessionFactory() {
}
public static Session getSession() throws HibernateException {
log.info("getSession is run") ;
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
log.info("SessionFactory.getSession() session is null or close") ;
if (sessionFactory == null) {
log.info("SessionFactory.getSession() rebuildSessionFactory() is running") ;
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession(): null;
threadLocal.set(session);
}
return session;
}
public static void rebuildSessionFactory() {
log.info("rebuildSessionFactory is run") ;
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
log.error("erro creating sessionFactory") ;
e.printStackTrace();
}
}
public static void closeSession() throws HibernateException {
log.info("closeSession is run") ;
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
log.info("SessionFactory.closeSession() session is not null") ;
if(!session.isOpen()){
System.out.println("该 session 已经关闭") ;
}
session.close();
}
}
public static org.hibernate.SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void setConfigFile(String configFile) {
SessionFactory.configFile = configFile;
sessionFactory = null;
}
public static Configuration getConfiguration() {
return configuration;
}
}
HibernateSessioniFactory主要负责session的开和关。
2.HibernateSessionFilter(要编写的过滤器,主要处理session的关闭)
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.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.ad.session.HibernateSessionFactory;
public class HibernateSessionFilter implements Filter {
private static final Log log = LogFactory.getLog(HibernateSessionFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("HibernateSessionFilter is end") ;
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException {
log.debug("HibernateSessionFilter start");
try{
//request 之前要处理的代码
chain.doFilter(arg0, arg1);
//response之后要要处理的代码
}catch (Exception e) {
e.printStackTrace();
} finally{
HibernateSessionFactory.closeSession();
}
}
@Override
public void destroy() {
System.out.println("HibernateSessionFilter is start") ;
}
}
该过滤器只处理session的关闭,似乎有点浪费了,在这也可以加上字符集的处理。
Filter运行原理(个人认为,有误请多指教):首先建立一个过滤类,需继承Filter接口,必须实现三个方法:
init:服务器启动时运行该方法,运行期间不执行;
doFilter:运行期间执行,其作用是request之前要做那些工作,response之后(即服务器将内容全部发回View层后)
要做那些工作。每次访问服务器都会执行doFilter方法
destroy:服务器终止时运行。
3. 在web.xml中的配置如下:
<filter>
<filter-name>hibernateSession</filter-name>
<filter-class>
com.c35.ad.filter.HibernateSessionFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateSession</filter-name>
<url-pattern>/*</url-pattern><!-- 过滤所有发回服务器的请求-->
</filter-mapping>
4.dao(demo中的UserDao)
public class UserDao implements BaseDao {
private static final Logger log = Logger.getLogger(UserDao.class);
private Session session ;
public UserDao(){
log.info("UserDao construct is running") ;
session = SessionFactory.getSession() ;
}
@Override
public boolean save(Object o) {
log.info("UserDao save is running ");
boolean flag = false ;
Transaction tran = null;
try {
tran = session.beginTransaction();
session.save(o);
tran.commit();
flag = true ;
} catch (Exception e) {
log.error("error save user");
flag = false ;
if (tran != null) {
try {
tran.rollback();
} catch (HibernateException e1) {
log.error("save Transaction rollback is error "+e1.getMessage()) ;
}
}
e.printStackTrace();
}finally{
//session.close() ;//这里就不需要在关闭session直接交给filter来处理
}
return flag ;
}
}
以上是本人的学习总结,有误之处请多多指教,希望对刚学hibernate的同志们有所帮助。
分享到:
相关推荐
在探讨“hibernate过滤器使用例子”这一主题时,我们深入分析了如何在Hibernate框架中运用过滤器功能,以及如何结合分页技术优化数据查询效率。以下将详细阐述相关知识点,包括过滤器的基本概念、配置方法、源码解析...
### 过滤器对于Session周期的控制 在探讨如何通过`OpenSessionInViewFilter`来有效管理Hibernate中的Session生命周期之前,我们需要先理解Session及其生命周期的基本概念。 #### Session与生命周期 在Hibernate...
在Java Web开发中,过滤器(Filter)是一个非常重要的组件,它主要用于在请求被实际处理之前或之后执行一些预处理或后处理任务。过滤器在Servlet规范中定义,是实现Servlet API的一部分,允许开发者对HTTP请求和响应...
2. **登录验证**:过滤器可以检查请求中的session或cookie,如果发现有效的用户信息,说明用户已登录,否则阻止其访问特定的URL。 3. **安全过滤**:为了防止SQL注入和XSS攻击,过滤器还可以对用户输入的数据进行...
这通常在Controller层或者过滤器中进行,通过查询数据库来检查当前用户是否有执行特定操作的权限。 总结起来,这个“Hibernate权限管理例子”展示了如何使用Hibernate注解来构建一个基本的权限管理系统,包括用户、...
- 这个过滤器的作用是在每个HTTP请求开始时开启一个Hibernate session,并在请求结束时关闭该session。这样可以确保在处理请求的过程中,session始终处于打开状态,从而避免因session提前关闭而导致的数据访问问题...
此外,还涵盖了如何使用SessionFactory和Session对象,它们是Hibernate操作数据库的核心组件。 实体管理是Hibernate中的重要部分,书中会详细介绍如何定义实体类,使用注解来声明属性与数据库字段的映射,以及如何...
1. **添加(Create)**:在Action类中创建一个新的Java对象,设置其属性,然后通过Hibernate的SessionFactory创建Session,使用Session的save()或saveOrUpdate()方法将对象持久化到数据库。 2. **删除(Delete)**...
- **过滤器设置**:介绍了如何为查询结果添加过滤器,实现动态过滤功能。 - **过滤器应用实例**:提供了具体的代码示例,演示如何应用过滤器。 #### 十三、超越关系型数据库:NoSQL 支持 - **NoSQL 概念**:简要...
2. **登录验证逻辑**:如何在过滤器中检查用户Session中的登录状态,以及未登录时如何重定向到登录页面。 3. **Spring框架**:可能涉及到Spring的AOP(面向切面编程)和Security模块,用于实现更安全的登录管理和...
该模式的核心在于通过Spring提供的`OpenSessionInViewFilter`过滤器,在视图渲染过程中保持Hibernate Session的打开状态,从而简化了事务管理,并避免了一些常见的懒加载异常。 #### 一、OpenSessionInViewFilter...
- **Session**: Hibernate进行所有数据库操作的基本上下文环境,是线程不安全的,每次操作都应打开新的Session,并在操作完成后关闭它。 - **Transaction**: 事务控制。 - **Query**: 查询操作。 - **Configuration*...
12. `disableFilter(String filterName)` 和 `enableFilter(String filterName)`:这两个方法用于启用或禁用Session中的过滤器。过滤器允许在查询执行前对结果进行额外的限制。 13. `disconnect()`:断开Session与...
在`web.xml`中,我们需要配置Struts2的过滤器,通常会有一个`<filter>`元素,定义名为`struts2`的过滤器,其类为`org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter`。过滤器链中,Struts2...
1. **配置WebWork**: 配置web.xml以启动WebWork,设置ActionServlet和过滤器。 2. **配置Spring**: 创建Spring配置文件,定义bean并实现依赖注入。 3. **配置Hibernate**: 配置Hibernate的hibernate.cfg.xml文件,...
SpringMVC、Security和Hibernate是Java开发中三个非常重要的框架,它们各自负责应用程序的不同层面,协同工作可以构建出高效、安全且数据管理...同时,也可以尝试自定义拦截器、过滤器和安全策略,以满足特定项目需求。
Struts2和Hibernate是两种非常流行的Java开源框架,它们分别用于MVC(Model-View-Controller)架构的控制层和数据持久化层。Struts2是Apache软件基金会下的一个项目,它提供了强大的动作调度和视图渲染功能,而...
- 添加`HibernateSessionUtilFilter`过滤器:这个过滤器是OSIV的核心,它在请求开始时绑定Session到请求上下文,并在请求结束时清理Session。 - 修改DAO方法:在获取数据时,可能需要考虑到Session的生命周期,...
- **OpenSessionInView**:是一种设计模式,用于Web应用中,通过过滤器在请求开始时打开`Session`,结束时关闭,确保整个请求过程中`Session`可用,从而支持延迟加载。但这种方法可能导致过多的数据库连接,因此也...