Hibernate懒加载异常说明及其解决方法.........
2015-02-25 15:50
411 查看
在集成ssh2三大框架的时候很容易就会造成懒加载异常,通常显示的错误信息是:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
懒加载异常出现的原因:
我们在Action中调用Service中的方法,方法中开始时open session,当调用结束后close session,例如类User中有一个Department属性,我们使用Hibernate查询一个User时,hibernate默认是懒加载的,此时查询出的User不会把Department中所有的信息查询出来。当session 关闭后我们在Result中(例如在jsp中打印department.name)使用到了Department的name属性时就会出现懒加载异常。
解决方案1:不用懒加载(不推荐)
解决方案2:
我们不在方法结束的时候关闭session,在执行完Action Result之后,通过过滤器关闭session,具体如下:
使用OpenSessionInViewFilter解决解决懒加载问题,在web.xml中配置:
<!-- openSessionInViewFilter,改过滤器在view渲染时始终开启session,一劳永逸解决hibernate的懒加载问题,
该过滤器必须配置在struts2过滤器之前,一般推荐使用(由于性能问题,在view渲染时始终开启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>
解决方案3.
例如涉及三个类 分别为Survey、Page、Question类,三个类的关联关系
class Survey{
private Long id;
private List<Page> pageList=new ArrayList<Page>();
}
class Page{
private Long id;
private List<Question> questionList=new ArrayList<Question>();
}
class Question{
private Long id;
}
方法是强行在service层面是初始化代理对象.
public Survey getSurveyWithChildren(Long sid){
Survey s = surveyDao.getEntity(sid);
//强行初始化pages和questions集合
for(Page p : s.getPages()){
p.getQuestions().size();
}
return s;
}
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
懒加载异常出现的原因:
我们在Action中调用Service中的方法,方法中开始时open session,当调用结束后close session,例如类User中有一个Department属性,我们使用Hibernate查询一个User时,hibernate默认是懒加载的,此时查询出的User不会把Department中所有的信息查询出来。当session 关闭后我们在Result中(例如在jsp中打印department.name)使用到了Department的name属性时就会出现懒加载异常。
解决方案1:不用懒加载(不推荐)
解决方案2:
我们不在方法结束的时候关闭session,在执行完Action Result之后,通过过滤器关闭session,具体如下:
使用OpenSessionInViewFilter解决解决懒加载问题,在web.xml中配置:
<!-- openSessionInViewFilter,改过滤器在view渲染时始终开启session,一劳永逸解决hibernate的懒加载问题,
该过滤器必须配置在struts2过滤器之前,一般推荐使用(由于性能问题,在view渲染时始终开启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>
解决方案3.
例如涉及三个类 分别为Survey、Page、Question类,三个类的关联关系
class Survey{
private Long id;
private List<Page> pageList=new ArrayList<Page>();
}
class Page{
private Long id;
private List<Question> questionList=new ArrayList<Question>();
}
class Question{
private Long id;
}
方法是强行在service层面是初始化代理对象.
public Survey getSurveyWithChildren(Long sid){
Survey s = surveyDao.getEntity(sid);
//强行初始化pages和questions集合
for(Page p : s.getPages()){
p.getQuestions().size();
}
return s;
}
相关文章推荐
- Hibernate延时加载lazy机制问题及其解决方法
- Hibernate延时加载lazy机制问题及其解决方法
- 使用MySQL和Hibernate时,出现java.lang.UnsupportedOperationException: Update queries only supported through HQL异常的解决方法
- Hibernate异常No row with the given identifier exists 解决方法
- Android 加载大图片造成OOM异常解决方法
- Hibernate中解决懒加载的方法
- Spring注解方式,异常 'sessionFactory' or 'hibernateTemplate' is required的解决方法 转载的
- IE 6 下无法加载图片的奇怪问题及其解决方法
- org.hibernate.InstantiationException异常的解决方法
- SharePoint 疑难杂症之加载控件TaxonomyPicker.ascx失败及其解决方法
- Hibernate:unexpected end of subtree异常的解决方法
- Hibernate 3.x "org.hibernate.LazyInitializationException: illegal access to loading collection"异常解决方法
- org.hibernate.NonUniqueObjectException异常解决方法(2)
- org.hibernate.NonUniqueObjectException异常解决方法(1)
- 【CSS笔记之五】IE6/IE7/IE8下float:right的异常及其解决方法
- Hibernate Dialect must be explicitly set异常解决方法
- hibernate先删除数据,紧接着执行插入时的异常解决之道——中间不能调用flush()、clear()等方法
- 学习Hibernate是遇到的异常集解决方法
- org.hibernate.NonUniqueObjectException异常解决方法
- Akka框架学习中遇到的部分错误和异常及其解决方法