懒惰初始化角色集合失败: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
Spring Boot 中的 Hibernate 无法懒惰地初始化角色集合,无法初始化代理 - 没有 Session 异常