懒惰初始化角色集合失败:someEnttiy.otherTitles

Posted

技术标签:

【中文标题】懒惰初始化角色集合失败:someEnttiy.otherTitles【英文标题】:Failed to lazily initialize a collection of role:someEnttiy.otherTitles 【发布时间】:2018-07-14 22:20:02 【问题描述】:

我想测试https://github.com/JonkiPro/popcorn/blob/develop/popcorn-core/src/main/java/com/jonki/popcorn/core/jpa/service/MoviePersistenceServiceImpl.java#L153的方法。该类具有 @Transactional 注释,并且实体的列表是 LAZY 的,因此在应用程序运行时使用列表没有问题。 我写了一个测试

    @Test
public void canCreateOtherTitle() throws ResourceException 
    ...

    this.moviePersistenceService.createOtherTitle(
            otherTitle,
            this.movieRepository.findByIdAndStatus(MOV_1_ID, DataStatus.ACCEPTED)
                    .orElseThrow(IllegalArgumentException::new)
    );

   ...

运行测试后出现异常

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.jonki.popcorn.core.jpa.entity.MovieEntity.otherTitles, could not initialize proxy - no Session

一行

    at com.jonki.popcorn.core.jpa.service.MoviePersistenceServiceImpl.createOtherTitle(MoviePersistenceServiceImpl.java:162)

在代码中 https://github.com/JonkiPro/popcorn/blob/develop/popcorn-core/src/main/java/com/jonki/popcorn/core/jpa/service/MoviePersistenceServiceImpl.java#L162

为什么会这样?该方法在应用程序正常运行期间可以正常工作,但在测试期间会引发异常。

整个测试 https://pastebin.com/fewHBUff

【问题讨论】:

【参考方案1】:

您的各种服务方法工作正常,因为您已将整个服务类注释为@Transactional。这意味着 Spring 将自动打开一个 Session,Hibernate 将使用该 Session 来初始化惰性集合。

另一方面,您的测试类或测试方法都没有注释,因此您得到了错误。您可以尝试使用@Transactional 注释测试方法,我想这会解决您的问题。

【讨论】:

我在方法 pastebin.com/9bfaqeU2 上添加了 @Transactional 注释,但我收到错误 java.lang.IllegalStateException: Cannot start new transaction without ending existing transaction 你知道我还能做些什么吗?

以上是关于懒惰初始化角色集合失败:someEnttiy.otherTitles的主要内容,如果未能解决你的问题,请参考以下文章

懒惰初始化角色集合失败:someEnttiy.otherTitles

org.hibernate.LazyInitializationException:懒惰初始化角色集合失败(Hibernate + Spring)

Hibernate 无法懒惰地初始化角色集合 无法初始化代理 - 没有会话

无法懒惰地初始化角色集合,..无法初始化代理 - 无会话 - JPA + SPRING

在将对象转换为json期间,无法懒惰地初始化角色集合

Spring Boot 中的 Hibernate 无法懒惰地初始化角色集合,无法初始化代理 - 没有 Session 异常