8.Hibernate Open Session In View模式
2016-07-26 14:02
253 查看
是什么在Open Session In View模式
hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时 session已关闭,所以就会出现异常。 比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们 希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Session In view 。
其实比较好的理解就是,关于Session关闭的问题,如果我们在数据访问层关闭了Session,那么我们在业务逻辑层想要获取,延迟加载的数据时,就会抛出异常。相对应的如果业务逻辑层关闭Session,那么也会在表示层获取数据的时候出现异常。所以我们的解决方法就是当访问网页的时候,请求开始和响应结束的时候,使用同一个Session。请求开始创建Session,响应结束关闭Session。
这里就要将我们的BaseDao修改一下使用getCurrentSession()方法,使用该方法的时候不需要我们手动关闭Session,而是在事务commit的时候会自动关闭Session。
这张图可以看出,我们要什么时候开启事务,什么时候关闭事务。
在这里需要使用Filter过滤器。
//请求到达时,打开Session启动事务
session = HibernateUtil.currentSession();
tx = session.beginTransaction();
//执行请求连接
arg2.doFilter(request, response);
//返回响应时,提交事务
tx.commit();
过滤器的执行顺序是,先执行请求到达时的数据,在执行请求连接,最后响应结束后执行arg2.doFilter(request, response);方法后的代码。
hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时 session已关闭,所以就会出现异常。 比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们 希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Session In view 。
其实比较好的理解就是,关于Session关闭的问题,如果我们在数据访问层关闭了Session,那么我们在业务逻辑层想要获取,延迟加载的数据时,就会抛出异常。相对应的如果业务逻辑层关闭Session,那么也会在表示层获取数据的时候出现异常。所以我们的解决方法就是当访问网页的时候,请求开始和响应结束的时候,使用同一个Session。请求开始创建Session,响应结束关闭Session。
这里就要将我们的BaseDao修改一下使用getCurrentSession()方法,使用该方法的时候不需要我们手动关闭Session,而是在事务commit的时候会自动关闭Session。
这张图可以看出,我们要什么时候开启事务,什么时候关闭事务。
在这里需要使用Filter过滤器。
//请求到达时,打开Session启动事务
session = HibernateUtil.currentSession();
tx = session.beginTransaction();
//执行请求连接
arg2.doFilter(request, response);
//返回响应时,提交事务
tx.commit();
过滤器的执行顺序是,先执行请求到达时的数据,在执行请求连接,最后响应结束后执行arg2.doFilter(request, response);方法后的代码。
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- 肯特·贝克:改变人生的代码整理魔法
- 你应该学习哪种编程语言?
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- [转]我们需要一种其他人能使用的编程语言
- DB2编程序技巧(1)
- DB2编程序技巧 (四)
- 女人VS编程_国庆快乐
- DB2编程序技巧 (六)
- DB2编程序技巧 (三)