java Spring事务中的LazyInitializationException

icomxhvb  于 2023-08-02  发布在  Java
关注(0)|答案(2)|浏览(123)

在我工作的Sping Boot 项目中,我添加了Hibernate ORM plugin来启用实体中@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

8e2ybdfx

8e2ybdfx1#

您需要在application.yml中激活

spring:
  jpa:
    properties:
      hibernate:
        enable_lazy_load_no_trans: true

字符串
这将允许延迟加载在创建具有延迟加载属性的对象的会话之外工作。
参考:https://www.baeldung.com/hibernate-lazy-loading-workaroundSolve Hibernate Lazy-Init issue with hibernate.enable_lazy_load_no_transhttps://vladmihalcea.com/the-hibernate-enable_lazy_load_no_trans-anti-pattern/

unhi4e5o

unhi4e5o2#

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

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

字符串

相关问题