我是靠谱客的博主 沉默跳跳糖,这篇文章主要介绍如何解决hibernate一对多注解懒加载失效问题,现在分享给大家,希望可以做个参考。

hibernate一对多注解懒加载失效

在House类里有关联HouseInfo,设置了懒加载

但是页面ajax返回还是有HouseInfos的数据。

经排查,问题出在controller这边

@response注解启用jackson框架对House进行解析

然后调用了每个属性的get方法,自然houseInfos的懒加载就失效了

解决方法

给houseInfos字段加上@JsonIgnore注解忽略json解析

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

在集成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中配置:

复制代码
1
2
3
4
5
6
7
8
9
10
<!-- 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类,三个类的关联关系

复制代码
1
2
3
4
5
6
7
8
9
10
11
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层面是初始化代理对象.

复制代码
1
2
3
4
5
6
7
8
public Survey getSurveyWithChildren(Long sid){    Survey s = surveyDao.getEntity(sid);   //强行初始化pages和questions集合    for(Page p : s.getPages()){     p.getQuestions().size();   }    return s; }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持靠谱客。

最后

以上就是沉默跳跳糖最近收集整理的关于如何解决hibernate一对多注解懒加载失效问题的全部内容,更多相关如何解决hibernate一对多注解懒加载失效问题内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(166)

评论列表共有 0 条评论

立即
投稿
返回
顶部