记录一个最近在开发过程中遇到的问题。项目是用ssh做的。
场景:要查出一个列表,实体类如下
public class Item implements Serializable{ private static final long serialVersionUID = 7303799225184433737L; private Integer id; private Integer bidsId; private String name; private Double fullScore; private String standard; private String type; private List<Grade> companyGradeList; //setter and getter... }
需要查出所有人的itemList,对于每个人来说companyGradeList是不同的。
在action中循环查出每个人的itemList,部分代码如下
List<BidsEmp> emplist = (List<BidsEmp>)gradeService.findByExample(bemp); for(BidsEmp bmp:emplist) { List<Item> itl = (List<Item>) gradeService.getItemList(item, bmp.getEmpId(), companyList); for(Item it:itl) { List<Grade> glist = it.getCompanyGradeList(); for(Grade g:glist) { //System.out.println(g.getScore()); } } }
service层中的getItemList没什么特别,只是为每个item的companyGradeList赋值而已,因为companyGradeList没有在hbm文件中配置,只是额外加的一个属性。然后问题就出现了,所有人的companyGradeList都是一样的,都是最后的那个人的。
猜想是因为session一级缓存的问题,导致每次查出的itemList都是同一个。第一次会从数据库查,以后再查Item的时候因为session中已经有了,就直接拿的缓存中的。我在action中用下面的方法比较
Item item1 = null; Item item2 = null; List<BidsEmp> emplist = (List<BidsEmp>)gradeService.findByExample(bemp); List<Item> itl = (List<Item>) gradeService.getItemList(item, emplist.get(0).getEmpId(), companyList); item1 = itl.get(0); itl = (List<Item>) gradeService.getItemList(item, emplist.get(1).getEmpId(), companyList); item2 = itl.get(0); System.out.println(item1==item2);
print结果为true,也就是说两次拿到的Item是同一个对象。
但是我循环查询是在action中做的,没有在service中,session已经关闭了啊……忽然想起来项目中用到了OpenSessionInView,这样的话,session会在会话中一直保持打开。
<filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
我将此配置去掉,再执行之前方法,print结果为false了。
解决办法:在service中每次做查询的时候new出Item对象,然后将查询到的Item进行BeanUtils.copyProperties,这样每次得到的结果都是不一样的。
相关推荐
介绍Spring+hibernate opensessioninview问题
为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考...4.在页面上通过 jstl 很优雅的获取数据 5.通过 spring aop(aspectJ) 声明事务 6.通过formular 映射参数表,指定两个死的变量
OpenSessionInView项目整合jar包
Spring提供的CharacterEncoding和OpenSessionInView功能
在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛...
SSH项目整合示例【OpenSessionInView】所用到的jar包 包含Struts + Hibernate + Spring所有jar及其依赖的jar
NULL 博文链接:https://8366.iteye.com/blog/472141
NULL 博文链接:https://likenice.iteye.com/blog/290162
和Spring中OpenSessionInView由于org.springframework.web.struts.ContextLoaderPlugIn中保存同一个对象的名不同导致openSessionInView失效 稍微修改后在struts-config.xml中使用MyContextLoaderPlugIn.jar包中...
NULL 博文链接:https://yanzhenwei.iteye.com/blog/1701164
3,在web.xml中配置 spring 的 OpenSessionInView 过滤器(解决抛LazyInitializationException的问题) 1,配置 <!-- 配置 spring 的 OpenSessionInView 过滤器 --> <filter-name>OpenSessionInView ...
SSH项目整合示例【OpenSessionInView】源码
最新版SSH项目整合 实现了OpenSessionInView。 hibernate5.2.3+struts2.5.2+spring4.3.3
09_Spring如何装配各种集合类型的属性 10_使用构造器装配属性 11_用@Resource注解完成属性装配 12_编码剖析@Resource注解的实现原理 13.@Autowire注解与自动装配 14.让Spring自动扫描和管理Bean 15.使用JDK中...
使用 AOC 拦截器而不是过滤器进行 OpenSessionInView 处理 列出一个国家的城市和添加城市的可能性(bean 验证和自动检索 lat 和 lng 坐标) 安全 安全的 REST Web 服务 使用 CSRF 令牌 角度父状态的问题 有用的链接 ...
Spring 的配置文件:..........................................................................................................7 1.3.4 在配置中配置类:........................................................