Spring 事务中的 LazyInitializationException
LazyInitializationException in a Spring Transaction
在我正在工作的 Spring 启动项目中,我添加了 Hibernate ORM plugin 来为我的实体中的 @Lob
字段启用延迟加载,这不是开箱即用的对于 DB2。延迟加载有效,当我检索对象时,lob 字段尚未加载。但是现在出现了一个新问题,当我想要获取 blob 字段时,我得到了 LazyInitializationException
。现在我做了一些调试和 Google 搜索。我尝试将 @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, Solve Hibernate Lazy-Init issue with hibernate.enable_lazy_load_no_trans and https://vladmihalcea.com/the-hibernate-enable_lazy_load_no_trans-anti-pattern/
在我正在工作的 Spring 启动项目中,我添加了 Hibernate ORM plugin 来为我的实体中的 @Lob
字段启用延迟加载,这不是开箱即用的对于 DB2。延迟加载有效,当我检索对象时,lob 字段尚未加载。但是现在出现了一个新问题,当我想要获取 blob 字段时,我得到了 LazyInitializationException
。现在我做了一些调试和 Google 搜索。我尝试将 @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, Solve Hibernate Lazy-Init issue with hibernate.enable_lazy_load_no_trans and https://vladmihalcea.com/the-hibernate-enable_lazy_load_no_trans-anti-pattern/