前言
这次测试的时候遇到了一个懒查询异常,懒查询错误在上个月也遇到过,当时参考网上意见关闭实体间懒查询。一周汇报的时候,老师建议我使用@Transactional事务注解,当时也顺利解决了。这次又遇到一个比较复杂的通过@Transactional事务注解却解决不了。
解决过程
主要涉及方法大概是这样的,有一个队列存储元素,方法一是一个后台接口,负责将前台传入元素入队,方法二执行定时任务,每隔一段时间查看队列是否为空,如果不为空,则执行相应方法。执行相应方法时报错,说这个队头元素的关联实体的关联实体的关联实体报懒查询错误。我尝试在方法二上加入@Transactional事务注解,但是并没有解决问题,还是报相同错误。我也尝试在方法一上加入事务注解,也没有解决问题。
于是我通过上次错误,在相应对应实体上关闭懒查询,问题解决。但是这是单纯的关闭懒查询会徒增数据库压力。想着通过更好的办法解决。
然后就遇到了奇怪的事情。
当我在方法一上打断点查看入队的元素是否有问题时,通过下方显示district.children有相应对象,传入的值没有问题
然后在方法二上打断点查看获取的元素是否又问题,通过下方显示还是没有问题(运行时是这里报错的)。
第二次没有查看断点一元素,直接跳过,查看断点二,发现报懒查询错误。
解决
想到用到关联实体类的时候重新从数据库查询一下。
// 防止懒查询异常
WebUser webUser = this.webUserService.getById(historyExportExcel.getWebUser().getId());
List<District> manageBuildings = this.districtService.getManageBuildingsWithWebUser(webUser);
成功解决。
仔细一想,我并没有将元素存入数据库中,而是临时保存在队列中,本质上保存在服务器内存中,但是也会有数据库相关错误,难道在java在底层也对类存储实现序列化存储?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。