Spring Hibernate双SessionFactory调用load()报LazyInitializationException问题
双SessionFactory场景下LazyInitializationException异常原因
该异常本质是load()方法返回的懒加载代理对象访问属性时,没有关联的可用Session。第一个SessionFactory调用正常、第二个调用出错,常见诱因如下:
- 第二个SessionFactory未绑定对应事务管理器
Spring声明式事务默认仅关联主SessionFactory对应的PlatformTransactionManager,多数据源场景下每个SessionFactory都需要独立配置专属的事务管理器。如果调用第二个SessionFactoryload()方法的业务逻辑,没有通过@Transactional(transactionManager = "第二个事务管理器的Bean名称")指定正确的事务管理器,方法执行时第二个SessionFactory不会生成可用的绑定Session,代理对象后续访问属性就会抛出无Session异常。 - 第二个SessionFactory的会话生命周期配置缺失
如果你给第一个SessionFactory配置了OpenSessionInViewFilter或OpenSessionInViewInterceptor,将Session生命周期延长到视图层渲染完成,但第二个SessionFactory没有做对应的配置,就会出现第二个SessionFactory的Session在事务提交后立即关闭,后续在事务外访问代理对象属性时找不到可用Session的问题。 - 实体与SessionFactory的映射关系不匹配
检查两个SessionFactory配置的实体扫描路径:如果调用load()加载的实体,只被第一个SessionFactory扫描注册过,你用第二个SessionFactory加载该实体时,生成的代理对象会和错误的Session上下文绑定,也会触发懒加载异常。 - 全局懒加载配置不一致
检查两个SessionFactory的hibernate.enable_lazy_load_no_trans配置项:如果第一个SessionFactory显式开启了该配置(允许事务外触发懒加载),第二个未开启,也会出现第一个调用正常、第二个抛异常的情况。该配置存在数据库连接泄漏风险,不建议生产环境开启。
内容的提问来源于stack exchange,提问作者Dimpy Aggarwal
相关产品推荐
相关产品推荐

