`
还有也许
  • 浏览: 169175 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

关于OpenSessionInViewFilter的学习

 
阅读更多

今天解决多数据源的问题的时候,发现了一篇好文章,下载的是百度文库里的,在此做个记录,大家也可共同学习一下。

OpenSessionInViewFilter主要解决一个什么问题呢?当Hibernate中的lazy属性为true时,通过get对象的对象时会报session错误。这个文件很好的解决了这个问题。

OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。

由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个LazyLoad的Exception。所以为了解决这个问题,Spring引入了这个Filter,使得Hibernate的Session的生命周期变长。

通过源代码大体思路是这样的:

首先获得SessionFactory,然后通过SessionFactory获得一个Session。然后执行真正的Action代码,最后根据情况将Hibernate的Session进行关闭。

注意事项:

1)通过getSession()获得的这个Session做了一次 
session.setFlushMode(FlushMode.NEVER); 有关FlushMode可以参考一下这篇文章。http://www2.matrix.org.cn/resource/article/2006-10-08/Hibernate+FlushMode+NEVER_312bca85-5699-11db-91a0-d98dff0aec60.html 
2)Spring对拿到的Session做了一次绑定到当前线程的做法,使得这个Session是线程安全的。

从上述代码其实可以得到一些对我们的开发有帮助的结论: 

 

2)由于拿到的Hibernate的Session被设置了session.setFlushMode(FlushMode.NEVER); 所以,除非你直接调用session.flush(),否则Hibernate session无论何时也不会flush任何的状态变化到数据库。因此,数据库事务的配置非常重要。(我们知道,在调用org.hibernate.Transaction.commit()的时候会触发session.flush())我曾经见过很多人在使用OpenSessionInView模式时,都因为没有正确配置事务,导致了底层会抛出有关FlushMode.NEVER的异常。

 

1)如果使用了OpenSessionInView模式,那么Spring会帮助你管理Session的开和关,从而你在你的DAO中通过HibernateDaoSupport拿到的getSession()方法,都是绑定到当前线程的线程安全的Session,即拿即用,最后会由Filter统一关闭。 

 

<!--EndFragment-->

最后我将下载的文章上传至附件,文章地址

http://wenku.baidu.com/view/6591f109581b6bd97f19ea7e.html

 

 

 

 

分享到:
评论

相关推荐

    OpenSessionInViewFilter

    OpenSessionInViewFilter个人学习总结

    SSH项目整合示例【OpenSessionInView】所用到的jar包

    SSH是Java Web开发中的一个流行框架组合,由Struts、Hibernate和Spring三个组件构成。这个框架集成提供了模型-...尽管如此,理解SSH的整合对于学习和理解Java Web开发的历史以及现代框架的设计思想仍然具有重要意义。

    spring学习笔记

    以上就是关于 Spring 学习笔记中的核心知识点详解,包括面向接口编程、IOC/DI、AOP、Spring 框架介绍及其在实际开发中的应用等方面的内容。通过深入理解这些知识点,可以帮助开发者更好地掌握 Spring 框架的核心原理...

    Spring学习笔记

    `opensessionInViewFilter`是一个关键组件,用来解决在多层请求中保持数据库事务的一致性,防止N+1查询问题。 **Spring JDBC**,Spring提供了对JDBC的支持,通过面向接口的方式,简化了数据库操作,降低了直接使用...

    马士兵spring学习笔记

    - 通过OpenSessionInViewFilter保持会话持续时间,确保事务的一致性。 #### 七、Struts2+Spring+Hibernate整合 **整合要点:** - Struts2作为Web层框架。 - Spring作为业务逻辑层框架,负责Bean管理和AOP等功能。 ...

    ssh2学习笔记

    根据提供的文件信息,我们可以深入探讨与...通过学习这样的框架,开发者不仅可以掌握Struts2、Spring和Hibernate的基本使用方法,还能了解如何将这些技术有效地整合在一起,从而构建出稳定可靠的Java Web应用程序。

    马士兵Spring学习笔记.docx

    根据提供的文件信息,我们可以归纳出一系列关于Spring框架的关键知识点,主要围绕着面向接口编程、IOC/DI、AOP以及Spring框架的基本使用等几个方面展开。 ### 面向接口编程 面向接口编程(面向抽象编程)是一种...

    我的智囊团(SSH)_04_开发提问及回复功能_上

    "我的智囊团(SSH)_04_开发提问及回复功能_上"这个项目...总的来说,这个项目实战涵盖了SSH框架的使用、数据库交互、错误处理、日志记录以及用户输入验证等核心知识点,是学习和提升Web应用开发技能的一个实践案例。

    马士兵Spring课堂笔记(超级详细版).pdf

    我们可以通过配置XML文件和注解来实现整合,并使用opensessionInviewfilter来解决会话问题。 Spring JDBC面向接口编程 本节讲解了如何使用Spring JDBC来实现面向接口编程。我们可以通过配置XML文件和注解来实现DAO...

    ssh2开发步骤与项目实践宝典

    2. **Hibernate配置**:使用`OpenSessionInViewFilter`过滤器,该过滤器使得Hibernate在HTTP请求的生命周期内保持一个数据库会话,解决了懒加载(Lazy Loading)时可能出现的错误。`hibernateFilter`将这个过滤器...

    ssh整合要点

    在web.xml中配置Spring的监听器ContextLoaderListener以初始化Spring应用上下文,并通过OpenSessionInViewFilter来处理可能出现的SessionFactory问题,确保在Controller和Service之间保持有效的Hibernate Session。...

    spring面试题集

    当遇到OpenSessionInView问题时,可以使用OpenSessionInViewFilter或OpenSessionInViewInterceptor来解决。 Spring的事务管理提供了强大且灵活的机制,主要包括编程式和声明式两种方式: 1. 编程式事务管理:通过...

    Struts+Hibernate+Spring的基本流程

    在Web应用中,为了确保每次请求都能获得新的Session,通常会配置openSessionInViewFilter,保证数据操作的正确性。 整合SSH的步骤如下: 1. 引入SSH相关的jar包,确保版本兼容。Struts和Hibernate的jar包可以从IDE...

Global site tag (gtag.js) - Google Analytics