报错信息:failed to lazily initialize a collection of could not initialize proxy - no session
配置:entity中有字段注解为@ManyToMany(fetch=FetchType.LAZY),配置文件除数据源外没有做额外的配置,事实证明也不需要
错误原因:在没有添加事务管理的方法中获取了延迟加载的字段。
解决办法:在需要获取获取延迟加载字段的地方加上事务注解。
注意事项:我测试了一个特殊情况,有两个方法A和方法B,A不需要事务,B需要,A里面调用B,B方法返回了一个User对象,User类里面有roles字段,Role类里面有permissions字段,在A方法中使用到了roles和permissions,报no session错误,原因是没有在B方法里预先获取出来,B方法才有事务管理
获取方式:只需要循环一边,注意permissions一定要循环一遍
User user = userRepository.findByUsername(username); for (Role role : user.getRoles()) { for (Permission permission : role.getPermissions()) {} }
其他:网上有解决方案一:添加open-in-view=true配置和添加OpenEntityManagerInViewFilter这个bean,这是无效的,因为springboot下open-in-view默认为true,并且自动添加了OpenEntityManagerInViewInterceptor,方案二:添加配置spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true,这是多余的,虽然能解决no session的问题,但这个很差的解决方式。