Open Session In View 模式

什么是 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>