无法延迟初始化角色集合:someEnttiy.otherTitles

时间:2018-07-14 22:20:02

标签: java spring spring-mvc spring-boot

我想测试方法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 个答案:

答案 0 :(得分:0)

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

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

相关问题