假设延迟载入出现session close的情况下
方法1.在web.xml中配置spring的openSessionInViewFilter
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
tx = session.beginTransaction();Customer customer=(Customer)session.load(Customer.class,new Long(1));
if(!Hibernate.isInitialized(customer))
Hibernate.initialize(customer);
tx.commit();
session.close();
customer.getName();
在业务逻辑层中使用延迟载入
即使在视图外面,Spring框架也通过使用AOP 拦截器 HibernateInterceptor来使得延迟载入变得非常easy实现。这个Hibernate 拦截器透明地将调用配置在Spring应用程序上下文中的业务对象中方法的请求拦截下来。在调用方法之前打开一个Hibernate会话。然后在方法运行完之后将会话关闭。
让我们来看一个简单的样例。如果我们有一个接口
BussinessObject:![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
类BusinessObjectImpl实现了BusinessObject接口:
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
通过在Spring应用程序上下文中的一些配置。我们能够让将调用BusinessObject的方法拦截下来,再令它的方法支持延迟载入。看看以下的一个程序片段:
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![hibernate <wbr>延迟载入带来的session <wbr>close的解决方法](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
当businessObject被调用的时候,HibernateInterceptor打开一个Hibernate会话,并将调用请求传递给 BusinessObjectImpl对象。当BusinessObjectImpl运行完毕后,HibernateInterceptor透明地关闭了会话。应用层的代码不用了解不论什么持久层逻辑,还是实现了延迟载入。