springboot+hibernate获取manyToMany注解的字段报no session错误

报错信息: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的问题,但这个很差的解决方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值