【问题标题】:LazyInitializationException using hibernate enhancement with @Basic(fetch = FetchType.LAZY)LazyInitializationException 使用带有 @Basic 的休眠增强(fetch = FetchType.LAZY)
【发布时间】:2020-02-27 00:04:44
【问题描述】:

我有一个带有 lob 字段的持久实体,它会被急切地获取,所以我配置了 hibernate-enhance-maven-plugin 并使它变得懒惰:

@Lob
@Column(name = "MY_FIELD")
@Basic(fetch = FetchType.LAZY)
private byte[] lazyField;

现在我在一个相当简单的测试中得到 LazyInitializationException

myJpaRepo.findAll().get(0).getLazyField()

无法执行请求的延迟初始化 [MyEntity.lazyField] - 没有会话和设置不允许在会话外加载

我使用 Spring Boot,并没有做任何特定的配置休眠。 此测试使用 h2 数据库。

MyRepo 使用@Transactional 进行注释。

如果我也注释了执行方法,则不会抛出异常:

@Transactional
public void test(){
    myJpaRepo.findAll().get(0).getLazyField()
}

每次有人尝试获取惰性字段时,我是否需要将其注释为事务性的,还是我可以采取其他措施来避免这种情况?

【问题讨论】:

    标签: java hibernate spring-boot


    【解决方案1】:

    错误表明您正在尝试访问休眠会话/事务边界之外的关联。

    在这种情况下,您还必须使用 @transaction 注释测试方法,以便您处于事务边界内并具有活动的休眠会话。

    【讨论】:

    • 是这样吗?每次获得该字段时,我是否应该将其注释为@Transactional?我想有一些方法可以让 Hibernate Lazy Proxy 做到这一点。
    • 遗憾的是在我使用 Quarkus 1.10.2 的情况下无法正常工作,尽管这可能是一个错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2016-09-16
    • 1970-01-01
    相关资源
    最近更新 更多