SpringBoot JPA 懒加载的问题 ---No session

当前项目中使用的orm框架为 JPA,其所使用的实现类是以Hibernate为基础的;

问题描述:
代码逻辑大致如下

  public class EntiryA{
       int a;
       int b;
       String c;
      @OneToMany(cascade = CascadeType.ALL, mappedBy = "Property", fetch = FetchType.LAZY)
       EntityB entityb;
  }
   class ServiceA{
          public Object functionA(){
                   Object   a = repository.findById(id);
                   for(){
                         serviceB.functionB(); 
                  }
   }
   class ServiceB{
          @Transactional(rollbackFor = Exception.class)
          public Object functionB()throws Exception {
                    do somthing.......
            }
   }

由于在functionA中做循环处理,因此没有加事物注解,在functionB中有多个数据库操作,为了保持一致性,加了事物回滚;

具体问题:当functionB中出现异常回滚时,EntiryA对象中采用懒加载的entityb的数据无法正常获取了,异常即为“could not initialize proxy -no session”;很明显,是数据库会话session 关闭导致的懒加载无法正常获取数据;

至于为什么会出现,有很多科普贴,我也就不重复了,可参考这个https://blog.csdn.net/johnf_nash/article/details/80658626;
通过直观现象推断,出现了这个问题的原因就是由于functionB中产生了异常,引起了回滚处理,导致session关闭。

我所不明白的是functionA并没有事物,真正的事物是在functionB中;而数据的查询是在functionA中产生的,对于没有事物的functionA,正常来说一旦查询完成那么这个数据库操作就应该结束了,session也就此中断,那么functionA中的持久化上下文是怎么维持的呢或者说怎么产生的呢,而且functionB中事物所创建的持久化上下文如何与functionA中的关联呢?

一下三篇博文应该能解释清楚大部分了
https://www.cnblogs.com/wangyonglong/p/5178450.html
https://blog.csdn.net/opnmzxcvb/article/details/4586452
https://blog.csdn.net/wongtseng/article/details/1730948

大概意思就是说,spring boot中会自动加入 spring.jpa.open-in-view=true 配置,他会帮助我么产生持久化上下文,且这一配置使JPA中的持久化上下文EntityManager可以跨越多个事物,延长session的周期,每个request请求的处理线程关联一个session;当创建新的事物时,如果发现当前处理线程没有数据库session则会创建一个新的,如果已经存在,则获取已有的session,因此functionB中的session与functionA使用的是同一个,而functionB中的回滚导致session关闭,那么懒加载就无法再次连接数据库获取数据了。

但是又出现了一个新的疑问,就是为什么functionB中的回滚会引起创建的Session关闭,而正常提交的话就可以继续执行使用懒加载数据呢:
测试来看,懒加载对象关联的Session对象不为空,且是同一个session对象,即使设置的事物传播属性为PROPAGATION_REQUIRES_NEW ,所以可以获取懒加载的对象内容,而一旦抛出异常产生回滚,则导致第一次创建的session对象关闭,那么整个线程的session也不再存在,外层函数与内部包含事物的函数共用一个session,同样也不存在,所以懒加载关联的session也就不存在了,故而导致no session异常。
如果看此文章的各位同学有更好的解释,欢迎分享。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值