懒加载的产生原因:
当使用hibernate查询一个对象的时候,如果Session关闭,在调用该对象关联的集合或者对象的时候,会出现懒加载异常
解决方案(以用户和角色为例):
方案一:
在session关闭之前,查询对象关联的集合或者对象,所有在业务层的方法上添加
public ElecUserfindUserByLogonName(String name) {
String condition = " and o.logonName = ?";
Object [] params = {name};
List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition,params, null);
//数据库表中存在该用户,返回ElecUser对象
ElecUser elecUser = null;
if(list!=null && list.size()>0){
elecUser = list.get(0);
}
/***
* 解决懒加载异常
除了OID之外的其他属性
*/
elecUser.getElecRoles().size();
return elecUser;
}
方案二:
在sevice层的方法中(Sessio关闭之前),初始化对象关联的集合或者对象
public ElecUserfindUserByLogonName(String name) {
String condition = " and o.logonName = ?";
Object [] params = {name};
List<ElecUser> list = elecUserDao.findCollectionByConditionNoPage(condition,params, null);
//数据库表中存在该用户,返回ElecUser对象
ElecUser elecUser = null;
if(list!=null && list.size()>0){
elecUser = list.get(0);
}
/***
* 解决懒加载异常
*/
Hibernate.initialize(elecUser.getElecRoles());
return elecUser;
}
方案三:
在ElecUser.hbm.xml中,添加lazy="false",查询用户的同时,立即检索查询用户关联的角色集合
<set name="elecRoles" table="elec_user_role"inverse="true" lazy="false">
<key>
<column name="userID"></column>
</key>
<many-to-many class="cn.itcast.elec.domain.ElecRole" column="roleID"/>
</set>
方案四:使用spring提供的过滤器OpenSessionInViewFilter,在web容器中添加该过滤器
在web.xml中添加(要求:该过滤器一定要放置到struts2的过滤器的前面,先执行该过滤器)
<!-- 添加spring提供的过滤器,解决hibernate的懒加载问题 -->
<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>*.do</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!-- 配置struts2的过滤器,这是struts2运行的核心 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.do</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>