Hibernate中的OpenSessionInView的源代码(转)

来源:互联网 发布:移动关闭数据上网功能 编辑:程序博客网 时间:2024/05/22 01:54

                                         Hibernate中的OpenSessionInView的源代码(转)

hibernate的lazy机制可以延迟对数据库的访问操作,但同时也带来一个问题。lazy机制里,只有当首次存取Set等集合数据时,hibernate才向数据库发送SQL查询。但这有个限制,就是要保证存取该entity时Session还未被关闭。为了保证session在我们存取时还未被关闭,在WEB应用中,一般采用OpenSessionInView模式。

下面是一个典型的OpenSessionInViewFilter的实现代码:

import java.io.IOException;

import javax.faces.context.FacesContext;
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 javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;

import com.syboos.orm.hiberate.utils.HibernateUtils;

/**
* OpenSessionInViewFilter
*
* @author:tenyo@syboos.com
* @author last modified by:
*/
public class OpenSessionInViewFilter implements Filter {
     private static final Log log = LogFactory.getLog(OpenSessionInViewFilter.class);
    
     /*
     * (non-Javadoc)
     *
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
     */
     public void init(FilterConfig filterConfig) throws ServletException {
         HibernateUtils.initialize();
     }

     /*
     * (non-Javadoc)
     *
     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
     *       javax.servlet.ServletResponse, javax.servlet.FilterChain)
     */
     public void doFilter(ServletRequest request, ServletResponse response,
             FilterChain chain) throws IOException, ServletException {
            
             try {
                 chain.doFilter(request, response);
                
             } finally {
                 try {
                     HibernateUtils.closeSession();
                 } catch (Exception ex) {
                     log.error(ex.getCause());
                     throw new ServletException(ex);
                 }
             }
     }

     /*
     * (non-Javadoc)
     *
     * @see javax.servlet.Filter#destroy()
     */
     public void destroy() {
        
     }
}



web.xml
-----------------

     <filter>
         <filter-name>OpenSessionInView</filter-name>
         <filter-class>com.tenyo.common.filter.OpenSessionInViewFilter</filter-class>
     </filter>

     <filter-mapping>
         <filter-name>OpenSessionInView</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>


注意上面代码里的红色部分。在doFilter方法里的最后部分对hibernate session 统一做关闭操作。
HibernateUtils是一个工具类,HibernateUtils.initialize();里主要做初期化操作。HibernateUtils.closeSession()关闭hibernate session.而在程序中不对session做关闭操作。