码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate懒加载异常说明及其解决方法.........

时间:2015-02-25 16:48:09      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

在集成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;
 }

Hibernate懒加载异常说明及其解决方法.........

标签:

原文地址:http://www.cnblogs.com/just-try-it/p/4276091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!