failed to lazily initialize a collection of role问题
原因:
事务配置在Service上,(一对多,多对一,多对多)映射的类是被代理的默认加载是Lazy = true所以没有加载事务且,当主类执行完事务关闭,就没有了session
解决办法:
方法1. @Lazy(value=false)
缺点:大量数据时,速度慢容易崩溃
@OneToMany(mappedBy="survey")
@Lazy(value=false)
public Set<Page> getPages() {
return pages;
}
方法2. web.xml添加上openSessionInViewFilter过滤器(必须在struts2前)
优点:渲染视图时打开session,一劳永逸解决懒加载问题,
缺点:大数据,高并发容易崩溃,性能下降
<!-- 解决failed to lazily initialize a collection of role问题 -->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
方法3:强行在service层面初始化代理对象,所以不会延迟加载(推荐)
public Survey getSurveyWithChildren(Integer sid){
//Survey s = surveyDao.getEntity(sid);
//降低耦合度
Survey s = this.getSurvey(sid);
//强行初始化pages和questions集合
for(Page p : s.getPages()){
p.getQuestions().size();
}
return s;
}
高内聚,低耦合:同一组件内部,提高复用率,组件之间,降低连接