`
tuoxie007
  • 浏览: 162749 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Hibernate懒加载问题的最终解决方案

    博客分类:
  • Java
阅读更多

Hibernate的强大之处之一是懒加载功能,可以有效的降低数据库访问次数和内存使用量。但用的不好就会出现org.hibernate.LazyInitializationException。

这个异常出现的原因很简单,主要时在加载懒数据时Session已经关闭造成的,如下图:

 

那么OK,我们来考虑怎么解决吧。

我们只要在渲染JSP之前不要关闭Session,而在JSP渲染之后再关闭就OK啊。我们知道,在JSP/Servlet中,可以配置过滤器来实现这种功能。

我们考虑两种情况的解决方案: 单使用Hibernate和用Spring来管理Hibernate。

 

1. 单使用Hibernate:

我们可以自己写一个过滤器:

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.SessionFactory;
import org.hibernate.StaleObjectStateException;
import org.sunxin.struts2.util.hibernate.HibernateUtil;


public class HibernateThreadFilter implements Filter
{
	private SessionFactory sf=null;
	
	public void init(FilterConfig arg0) throws ServletException
	{
		
		sf=HibernateUtil.getSessionFactory();
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException
	{
		try
		{
			
			sf.getCurrentSession().beginTransaction();
			
			chain.doFilter(request, response);
			
			sf.getCurrentSession().getTransaction().commit();
			
		}
		catch (StaleObjectStateException staleEx)
		{
            throw staleEx;
        }
		catch (Throwable ex)
		{
            ex.printStackTrace();
            try
            {
            //如果发生异常,让事务回滚。
                if (sf.getCurrentSession().getTransaction().isActive())
                {
                    sf.getCurrentSession().getTransaction().rollback();
                }
            } 
            catch (Throwable rbEx)
            {
               System.err.println(rbEx.toString());
            }
		}
	}

	public void destroy(){}

}

 

在web.xml中加入这个Filter的配置:

	<filter>
		<filter-name>HibernateThreadFilter</filter-name>
		<filter-class>org.sunxin.struts2.filter.HibernateThreadFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>HibernateThreadFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 这样就在访问后台代码之前打开session,访问后台代码之后关闭session。

 

2. 用Spring管理Hibernate:

I . Spring为我们提供了这样一个过滤器,我们这样配置一下就OK。

在web.xml中加入Filter的配置:

	<filter>
		<description>处理Hibernate的懒加载问题</description>
		<filter-name>openSessionInViewFilter</filter-name>
		<filter-class>
			org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
		</filter-class>
		<init-param>
			<description>
				默认情况下,这个Filter会在Spring的bean池中找一个叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,则应该在这里
				指定这个名字。
			</description>
			<param-name>sessionFactoryBeanName</param-name>
			<param-value>sessionFactory</param-value>
		</init-param>
		<init-param>
			<description></description>
			<param-name>singleSession</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>

 II . 同时Spring还为我们提供了另一种方案,就是使用拦截器,但偶还不太知道怎么配的,配的没有成功。还有这里需要用到spring-mvc.jar,不在spring.jar里面。还听说这个使用这个拦截器会有一些bug,偶现在也不知道到底是怎么个情况,有高人请指点。

  • 大小: 26 KB
  • 大小: 33.1 KB
9
0
分享到:
评论
2 楼 tuoxie007 2009-02-19  
stone2oo6 写道

感谢楼主的总结,不过偶认为被jsp渲染器之后的左边那个图应该叫html页面,而不是jsp页面

谢谢提醒!
1 楼 stone2oo6 2009-02-19  
感谢楼主的总结,不过偶认为被jsp渲染器之后的左边那个图应该叫html页面,而不是jsp页面

相关推荐

    Hibernate 4.4.1最终发布版本

    首先,Hibernate 4.4.1是一个重要的版本更新,它在4.x系列中提供了更稳定、性能更优的ORM解决方案。这个版本修复了前一版本中的许多已知问题,并引入了一些新的特性和改进,以提高开发效率和应用程序的性能。 1. **...

    Spring延迟加载和声明式事务处理最终解决方案(修正版)

    为了解决这个问题,Spring提供了两种主要解决方案: 1. **Open Session in View Interceptor (OSIV)**:这是Spring MVC中的一个拦截器,它的作用是在整个视图渲染过程中保持Hibernate Session的开放,确保在需要的...

    Apress - Pro Hibernate3

    - **高级开发者**:寻求更深层次的ORM解决方案和技术细节。 #### 六、学习建议 - **实践为主**:理论学习之后,一定要通过实际项目来进行实践,这样才能真正掌握Hibernate的核心知识。 - **官方文档**:官方文档是...

    hibernate完整开发包

    最后,"支持JAVA8"说明这个版本的Hibernate已经适应了Java 8的新特性,开发者可以充分利用Java 8的语法和功能来构建ORM解决方案。 **标签解析** 标签"hibernate5.0"强调了这是关于Hibernate 5.0版本的内容,这可能...

    Hibernate 框架总结

    从Hibernate的核心概念、工作原理到其实现细节,Hibernate框架提供了一套全面的解决方案,使得数据库操作更加简单和高效。 首先,Hibernate框架的核心接口包括Session、SessionFactory、Configuration、Transaction...

    hibernate-release-4.3.5.Final.zip

    Hibernate 4.3.5.Final作为稳定且最终的版本,为开发者提供了一个强大、可靠的持久化解决方案。它集成了最新的JPA规范,增强了查询能力和性能,并提供了友好的错误处理,是Java企业级开发中不可或缺的工具。无论你是...

    hibernate-distribution-3.6.10.Final基本包

    Hibernate是一个流行的数据持久化解决方案,它通过提供数据访问层,将Java对象与关系数据库之间的转换工作自动化,避免了大量SQL代码的编写。在Hibernate中,每个Java类对应一个数据库表,类的实例对应表中的记录,...

    hibernate-release-4.1.4.Final核心jar包

    总之,Hibernate 4.1.4.Final是一个强大且成熟的ORM解决方案,为Java开发者提供了便捷的数据库操作手段,极大地提高了开发效率。这个版本在稳定性、性能和API设计上都有所提升,是当时开发者们广泛采用的一个版本。

    Hibernate开发向导

    - **常见问题**:如脏读、不可重复读等问题及解决方案。 #### 三、持久化上下文 - **使实体持久化**:通过Session的`save()`方法将实体保存到数据库中。 - **删除实体**:使用`delete()`或`remove()`方法删除实体...

    ibatis与hibernate的区别

    - **强大的ORM支持:** Hibernate是一个全功能的ORM框架,它提供了一整套解决方案来实现对象关系映射。开发者可以通过简单的配置文件或注解定义对象和数据库表之间的映射关系。 - **自动化的SQL生成:** Hibernate...

    Hibernate JPA

    Hibernate JPA作为一种成熟且广泛使用的ORM解决方案,不仅简化了Java应用程序中对象与关系型数据库之间的交互,还为开发者提供了强大的工具和灵活的配置选项。无论是初学者还是经验丰富的开发者,都能从中受益。了解...

    基于JSP+Struts2+hibernate的个人博客系统

    在Web开发领域,构建一个功能完善的个人博客系统是一项常见的任务,而使用JSP、Struts2和Hibernate这三种技术的组合,可以创建出高效且易于维护的解决方案。下面将详细阐述这些技术以及它们在个人博客系统中的应用。...

    Velocity+Spring 2[1].0+Hibernate的Web应用开发框架

    Hibernate 是一个开放源代码的对象关系映射 (ORM) 解决方案,用于简化 Java 应用程序与数据库之间的交互。它允许开发者以面向对象的方式操作数据库,而无需编写 SQL 语句。Hibernate 的主要特点包括: - **自动代码...

    Hibernate所需jar包

    5. **JPA (Java Persistence API)**: 虽然Hibernate提供了自己的ORM解决方案,但JPA作为标准API,也常被集成。`javax.persistence.*`的jar包允许你在符合JPA规范的同时使用Hibernate。 6. **Commons Logging**: ...

    Hibernate+Spring+Struts2+ExtJS CRUD

    在IT行业中,构建高效、可维护的Web应用是至关重要的,而SSH(Spring、Struts2、Hibernate)和ExtJS的结合使用就是一种常见的解决方案。本文将深入探讨如何利用这些技术实现CRUD(创建、读取、更新和删除)功能,并...

    struts hibernate spring资料

    总结来说,SSH框架的集成提供了强大的企业级Web开发解决方案,通过Struts的控制层,Hibernate的数据持久化,以及Spring的全面支持,可以高效地构建复杂的应用程序,同时保持代码的清晰和可扩展性。

    struts+spring+hibernate实例

    Struts、Spring 和 Hibernate 是Java Web开发中的三个关键框架,它们共同构成了经典的“SSH”集成解决方案,用于构建高效、模块化的应用程序。这三个框架分别解决了不同的问题:Struts提供了MVC(模型-视图-控制器)...

    Hibernate

    - **Hibernate 提供了一个高度定制化的 API**,允许开发者根据具体需求灵活选择最适合的解决方案。 - 这种灵活性体现在多种层面,包括但不限于对象模型的设计、持久化逻辑的实现等。 ##### Auction Object Model - ...

    jsp源码移动ssh项目(struts+spring+hibernate+oracle)130222

    Hibernate 还支持懒加载等高级特性,有助于提高应用性能。 4. **Oracle 数据库**:项目选择了 Oracle 作为后端数据库。Oracle 是一个广泛使用的商业数据库管理系统,提供了强大的数据存储和检索能力。通过使用 ...

Global site tag (gtag.js) - Google Analytics