OpenSessionInView在查询集合时应当注意的问题
编程技术  /  houtizong 发布于 3年前   135
记录一个最近在开发过程中遇到的问题。项目是用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,这样每次得到的结果都是不一样的。
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接