Spring事务中的LazyInitializationException



在我工作的一个Spring Boot项目中,我添加了Hibernate ORM插件来为实体中的@Lob字段启用延迟加载,但这对DB2来说并不是开箱即用的。懒惰加载是有效的,当我检索对象时,lob字段还没有加载。但现在出现了一个新问题,当我确实想得到blob字段时,我得到了一个LazyInitializationException。现在我做了一些调试和谷歌搜索。我尝试将@Transactional添加到方法和类中,还尝试了多种传播选项,但都不起作用。

我还尝试使用EntityManager直接加载对象,但也出现了相同的异常:

Object object = entityManager.find(Object.class, id);
object.getLobField();

抛出的完整异常是:

org.hibernate.LazyInitializationException: Unable to perform requested lazy initialization [package.Object.lobField] - no session and settings disallow loading outside the Session

您需要在application.yml中激活

spring:
jpa:
properties:
hibernate:
enable_lazy_load_no_trans: true

这将允许延迟加载在创建具有延迟加载属性的对象的会话之外工作。

参考:https://www.baeldung.com/hibernate-lazy-loading-workaround,使用Hibernate.enable_Lazy_load_no_trans解决Hibernate懒惰初始化问题https://vladmihalcea.com/the-hibernate-enable_lazy_load_no_trans-anti-pattern/

Hibernate有一个解决方法,即enable_lazy_load_no_trans属性。启用此选项意味着惰性实体的每次提取都将打开一个临时会话,并在单独的事务中运行

尝试添加以下属性

System.setProperty("hibernate.enable_lazy_load_no_trans", "true");

相关内容

  • 没有找到相关文章

最新更新