hibernate 中fetch=FetchType.LAZY问题

我的实体类Deptment中@OneToMany(mappedBy="deptment",cascade=CascadeType.ALL,fetch=FetchType.... 我的实体类Deptment 中

@OneToMany(mappedBy="deptment",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
public Set<Employee> getEmployees() {
return employees;
}
在dao层中
public List<Deptment> queryDeptList() {

List<Deptment> deptList = this.hibernateTemplate.find("from Deptment");

return deptList;
}
为什么在jsp中读取DeptmentList会报错:failed to lazily initialize a collection of role: model.Deptment.employees, no session or session was closed;
前台jsp中我没有读取Deptment中的employees中数据啊。
在线等。。。求高手解答
展开
 我来答
tyz_唐耀祖
推荐于2016-02-01 · 超过26用户采纳过TA的回答
知道答主
回答量:100
采纳率:100%
帮助的人:60.1万
展开全部
这个是很典型的有懒加载引起的问题,你懒加载的时候只加载了了department的基本信息,而部门下的员工信息是懒加载的,当你要去用department下的employee信息,那么又会去加载。而此时你的session已经关闭了,所以才会报nosession错。
解决办法:在你的web.xml中添加下面的配置
<!-- 把session的关闭延迟到jsp页面显示之后,在配在struts2上面。-->
<filter>
<filter-name>OpenSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
追问
可是我前台没有读取集合employees啊,只是读取了部门的普通信息。。
追答
你报错的信息, model.Deptment.employees,   这个说明你在取employees  ,你仔细看看自己的代码,可能哪里隐藏的在取employees的信息。
laiy32
2013-08-13 · 超过11用户采纳过TA的回答
知道答主
回答量:36
采纳率:0%
帮助的人:29万
展开全部
你在jsp中调用dao已经脱离了Hibernate会话环境,由于你设的加载方式是FetchType.LAZY,所以娶不到,如果必须用lazy方式,你可以在 List<Deptment> deptList = this.hibernateTemplate.find("from Deptment");后循环一遍,
for(Deptment d : deptList){
d.getEmployees();
}
return deptList;
追问
不是说jsp中不读取集合employees就不会报错么?读取employees中的employee数据才会重新发起sql语句?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-13
展开全部
由于是LAZY 小毛病

如果不是集合,可以在 Manager层用session把每一个Deptment的子对象做一下refresh();

请参考这个http://zhidao.baidu.com/question/151488406
追问
LAZY的bug?那意思是这样是可以的?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式