评论

收藏

[Java] 如何解决hibernate一对多注解懒加载失效问题

编程语言 编程语言 发布于:2022-02-21 12:08 | 阅读数:293 | 评论:0

这篇文章主要介绍了解决hibernate一对多注解懒加载失效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
hibernate一对多注解懒加载失效
DSC0000.jpg

在House类里有关联HouseInfo,设置了懒加载
但是页面ajax返回还是有HouseInfos的数据。
经排查,问题出在controller这边
DSC0001.jpg

@response注解启用jackson框架对House进行解析
然后调用了每个属性的get方法,自然houseInfos的懒加载就失效了
解决方法
给houseInfos字段加上@JsonIgnore注解忽略json解析

Hibernate懒加载异常说明及其解决
在集成ssh2三大框架的时候很容易就会造成懒加载异常,通常显示的错误信息是:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
懒加载异常出现的原因
DSC0002.jpg

我们在Action中调用Service中的方法,方法中开始时open session,当调用结束后close session,例如类User中有一个Department属性,我们使用Hibernate查询一个User时,hibernate默认是懒加载的,此时查询出的User不会把Department中所有的信息查询出来。
当session 关闭后我们在Result中(例如在jsp中打印department.name)使用到了Department的name属性时就会出现懒加载异常。
解决方案1
不用懒加载(不推荐)
解决方案2
DSC0003.jpg

我们不在方法结束的时候关闭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;
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持CodeAE代码之家
原文链接:https://blog.csdn.net/u011870280/article/details/51140805

关注下面的标签,发现更多相似文章