【问题标题】:Failed to lazily initialize a collection of role:someEnttiy.otherTitles懒惰初始化角色集合失败: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

【问题讨论】:

    标签: java spring spring-mvc spring-boot


    【解决方案1】:

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

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

    【讨论】:

    • 我在方法 pastebin.com/9bfaqeU2 上添加了 @Transactional 注释,但我收到错误 java.lang.IllegalStateException: Cannot start new transaction without ending existing transaction
    • 你知道我还能做些什么吗?
    猜你喜欢
    • 2011-07-21
    • 2017-03-11
    • 1970-01-01
    • 2019-01-23
    • 2011-10-23
    • 2018-05-31
    相关资源
    最近更新 更多