当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

OpenSessionInView在查询集合时应当注意的问题

发表于: 2013-04-28   作者:com0606   来源:转载   浏览次数:
摘要: 记录一个最近在开发过程中遇到的问题。项目是用ssh做的。 场景:要查出一个列表,实体类如下 public class Item implements Serializable{ private static final long serialVersionUID = 7303799225184433737L; private Integer id; private Int

记录一个最近在开发过程中遇到的问题。项目是用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,这样每次得到的结果都是不一样的。

OpenSessionInView在查询集合时应当注意的问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
最近在给一个公司做一个项目, 项目技术选择采用 struts+spring+hibernater 框架技术 问题是这样的,
网站中常常会有一个问题选集页面,即是常常用到的FAQ页面。建立保存问题的数据表:faq表,表的结构
今天参考师兄的一个项目来做了一下SSH整合的实验,不过师兄用的是注解的方式,由于本人水平有限,还
尽管有人不喜欢ADO.NET Data Service,或者也有人不喜欢LINQ to SQL以及Entity Framework。但我还是
在我以往的用例分析中,使用这样格式的用例模式,对于大多数业务操作流程来说是得心应手的,但对于有
在我以往的用例分析中,使用这样格式的用例模式,对于大多数业务操作流程来说是得心应手的,但对于有
在我以往的用例分析中,使用这样格式的用例模式,对于大多数业务操作流程来说是得心应手的,但对于有
本文是看到的,然后结合自己之前学习的过程也碰到的问题,所以就引用过来了:http://www.cnblogs.co
百度JS图表工具Echarts http://echarts.baidu.com/doc/example.html 1、textField中添加文本时需注
百度JS图表工具Echarts http://echarts.baidu.com/doc/example.html 1、textField中添加文本时需注
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号