zoukankan      html  css  js  c++  java
  • OpenSessionInViewFilter 的配置及作用

    Hibernate允许对关联的对象,属性进行延迟加载,但是这个前提是必须保证延迟加载在同一个Hibernate Session范围之内进行。在实际开发中,都是采用分层的模式进行开发的,如果要在action层中使用一个由Service层返回的业务对象,延迟加载关联对象事,因加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常

    failed to lazily initialize a collection of role: com.po.Person.schools, no session or session was closed 
    ..........
    提示:延迟加载role集合失败,没有Hibernate Session或Session关闭

    OpenSessionInViewFilter作用就是把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现"Open Session in View"的模式。例如: 它允许在事务提交之后延迟加载显示所需要的对象

    如下是其官方文献:

    Servlet 2.3 Filter that binds a Hibernate Session to the thread for 
    the entire processing of the request. Intended for the "Open Session in View" pattern, 
    i.e. to allow for lazy loading in web views despite the original transactions 
    already being completed. 
    
    This filter makes Hibernate Sessions available via the current thread, 
    which will be autodetected by transaction managers. 
    It is suitable for service layer transactions via HibernateTransactionManager 
    or JtaTransactionManager as well as for non-transactional execution 
    (if configured appropriately). 
    

    OpenSessionInViewFilter在web.xml中配置如下:

       <filter>
            <filter-name>openSessionInView</filter-name>
            <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
            <init-param>
                <param-name>flushMode</param-name>
                <param-value>AUTO</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>openSessionInView</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
      <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
            <dispatcher>REQUEST</dispatcher>
            <dispatcher>FORWARD</dispatcher>
        </filter-mapping>

    注意事项:

    1.

    NOTE: This filter will by default not flush the Hibernate Session, 
    with the flush mode set to FlushMode.NEVER. It assumes to be used in combination 
    with service layer transactions that care for the flushing: 
    The active transaction manager will temporarily change the flush mode 
    to FlushMode.AUTO during a read-write transaction, 
    with the flush mode reset to FlushMode.NEVER at the end of each transaction. 
    If you intend to use this filter without transactions, 
    consider changing the default flush mode (through the "flushMode" property).

    该文献说OpenSessionInViewFilter默认采用FlushMode.NEVER刷新模式,该模式默认是不刷新Hibernate Session;在service层进行读写事务中它自动转变为FlushMode.AUTO,在事务结束后重置为FlushMode.NEVER

    2.特别注意的是:该过滤器需要配置在struts2的过滤器之前

  • 相关阅读:
    项目--Asp.net全局变量的设置和读(web.config 和 Gloab)
    项目--后台代码提示
    项目--给项目添加提示声音
    项目--正则表达式
    项目--HTML Canvas 和 jQuery遍历
    项目--用户自定义控件
    Bzoj2120/洛谷P1903 数颜色(莫队)
    Poj2482 Stars in Your Window(扫描线)
    Poj2182 Lost Cows(玄学算法)
    Poj3468 A Simple Problem with Integers (分块)
  • 原文地址:https://www.cnblogs.com/liaojie970/p/4885368.html
Copyright © 2011-2022 走看看