什么是 Open Session In View 模式
在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时 session已关闭,所以就会出现异常。 比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们 希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Session In view 。 我们可以filter来达到此目的
OpenSesstionInViewFilter.java 的主要代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package com.accp.filter;
import com.accp.util.HibernateUtil; import org.hibernate.HibernateException; import org.hibernate.Transaction;
import javax.servlet.*; import java.io.IOException;
public class OpenSesstionInViewFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { Transaction transaction = null; try { System.out.println("请求到达时打开session并启动事务"); transaction = HibernateUtil.currentSesstion().beginTransaction(); System.out.println("执行请求处理链"); filterChain.doFilter(servletRequest, servletResponse); System.out.println("返回响应时,提交事务"); transaction.commit(); } catch (HibernateException e) { e.printStackTrace(); if (transaction != null) { transaction.rollback(); System.out.println("回滚事务"); } } }
public void destroy() {
} }
|
web.xml 中 Filter 的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>OpenSesstionInView</filter-name> <filter-class>com.accp.filter.OpenSesstionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSesstionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
|