LazyInitializationException 使用 Hibernate 增强功能和 @Basic(fetch = FetchType.LAZY)

Sai*_*ita 5 java hibernate spring-boot

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

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

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

myJpaRepo.findAll().get(0).getLazyField()
Run Code Online (Sandbox Code Playgroud)

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

我使用 Spring Boot,没有做任何具体的配置 hibernate。本次测试使用h2数据库。

MyRepo 使用@Transactional 进行注释。

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

@Transactional
public void test(){
    myJpaRepo.findAll().get(0).getLazyField()
}
Run Code Online (Sandbox Code Playgroud)

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

小智 1

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

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