黑马程序员技术交流社区

标题: 【上海校区】SSS框架整合no session(延迟加载)问题分析及... [打印本页]

作者: 不二晨    时间: 2018-7-11 09:20
标题: 【上海校区】SSS框架整合no session(延迟加载)问题分析及...
问题描述:

        在做BOS物流管理系统的时候,点击区域页面显示配送区域信息,这个时候后台显示了no session的错误

看系统提示可以看出来是因为加载Area类中的subareas属性出现了问题。我们再来看下Area类中有哪些属性

        为什么Area中这么多属性,只有subareas属性出现了问题?可以看出来这里的subareas是一个集合,问题就出现在这里,在spring框架中集合属性的查询默认的是懒加载的,也就是说在service层调用dao层的查询方法时,dao层并不会向数据库发送查询语句,而是将查询语句藏在了session的一级缓存区域,在下一次subareas被使用到的时候才会真正向数据区发送查询语句,这样的好处是可以为系统节省资源,但是同样也带来一个问题,因为我们第一次调用subareas是在web层将查询到的数据打包成json数据的时候,但是我们的session在service层就已经被关闭了,我们都知道sss框架和ssh框架的底层都是Hibernate中的session对象对数据库进行操作的。因此就会出现no session的异常。

问题解决:第一种:让session存活到web层

    添加OpenEntityManagerInViewFilter过滤器(必须配置在struts拦截器前),原理就是将session的创建和关闭放在过滤器中,这样就可以让session存活到web层。

第二种:立即加载(不建议)

        立即加载就是消除懒加载,运用JPA注解的属性fetch=FetchType.EAGER


      这样就可以在dao层立即加载subareas,这样在web层就可以直接使用到subareas的数据了。

第三种:取消序列化

        如果subareas这个属性并不是需要的数据的话,可以通过注解让json在序列化Area的属性的时候,跳过subareas这个属性。这样就不需要向数据库查询subareas的数据了,也就不会出现懒加载的问题了。

【转载】原文地址:https://blog.csdn.net/GechangLiu/article/details/80994568



作者: 不二晨    时间: 2018-7-12 14:56
赞一个
作者: 吴琼老师    时间: 2018-7-12 16:16





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2