使用异步获取hibernate的树对象后,转为json,由于懒加载的原因在后台报错了。
<span style="white-space:pre"> </span>JSONArray tree = JSONArray.fromObject(list);
response.getWriter().write(tree.toString());
然后百度后找到了解决方案,在web.xml中添加配置:
<span style="white-space:pre"> </span><!-- 懒加载和json字符串转换错误解决方案 -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
后面我们来理解下原理,因为在hibernate解析视图层的时候session已经关闭,导致懒加载解析树的子类的时候不能正常获取数据。
然而OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。
由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个LazyLoad的Exception。所以为了解决这个问题,Spring引入了这个Filter,使得Hibernate的Session的生命周期变长。