使用OpenSessionInViewFilter解决lazy failed问题

来源:互联网 发布:java类声明 编辑:程序博客网 时间:2024/05/22 17:27

在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时 session已关闭,所以就会出现异常。 比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们 希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望只需要保证session一直打开就能避免lazy loading时不报错,这就是所谓的Open Session In view 。我们可以filter来达到此目的, 也可以用interceptor来做。

配置web.xml:

的

 

interceptor:

public class WebUtilDaoImpl extends HibernateDaoSupport implements IWebUtileDao{

の

{


请求刚发起时就会创建一个session实例,并绑定到当前线程上,至请求结束时,关闭该线程。在请求期间所有事务都使用这一个session。

在jsp页面上读取lazy对象时,并不是以事务方式进行的,而是以autocommit的方式提交select语句的。因此只需要保持session打开即可,无需事务的支持。


OpenSessionInViewFilter的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${搜索company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。

 

 

 

 

0 0