org.hibernate.lazyInitializationException(懒加载异常)

在有@ManyToOne注解标注的方法中这错误很常见,字面意义就是不能被初始化,因为session已经关闭了。

fetch=FetchType.LAZY就等于打开了延迟加载。

Hibernate中的get方法不论是否开启延迟加载都会一次加载所有基本数据类型属性的值,而load则不同,开启延迟加载后load(id),返回的对象会被Hibernate加一个壳(持久化上下文中没有缓存该对象的前提下),拦截所有非id属性的访问操作(getter,setter调用),只有id属性中有实际值(其实就是你调用load方法时传的那个),在session没有关闭的之前,如果访问除id外的其他属性才会发sql语句去查询,你这个错误就是因为在当前session关闭以后访问由load()加载的对象的非id属性,此时Hibernate尝试通过当前session发sql查询,但发现session已经关闭,这样才会报错。

在这里插入图片描述

在这里插入图片描述

简单理解就是因为,你使用了lazy=true,这样hibernate在从数据库中调数据的时候是不会把关联的对象查出来的,而是保存一个获取值得方法,在你使用getXXX()调用的时候,hiberante会利用这个保存的方法去从数据库中取数据。而往往我们在jsp页面中使用getXXX()准备展示数据的时候,session早已经在dao中就关闭了,我们该如何解决这种异常呢?

可以直接在报异常的实体类上加@Proxy(lazy=false),这里从上图可知,是读取关联类GeoWayEntity,DeviceInstallZoneEntity,GeoRegionEntity,DeviceDetailEntity这几个实体类,在其上加上@Proxy(lazy=false)即可,如图:

在这里插入图片描述

或者将FetchType.lazy 改成 EAGER 。

发布了51 篇原创文章 · 获赞 0 · 访问量 739

猜你喜欢

转载自blog.csdn.net/lxy1740/article/details/104307291