在spring boot集成测试中获取org.hibernate.LazyInitializationException

Sli*_*lim 6 java spring hibernate spring-mvc spring-boot

我正在尝试为 Spring Boot 应用程序编写集成测试。我有 Product 和 GalleryImage 域模型。他们是一对多的关系。

public class Product {
    ...

    @OneToMany(mappedBy = "product")
    private List<GalleryImage> galleryImages;
}
Run Code Online (Sandbox Code Playgroud)

我有一个集成测试如下:

@Test
public void testProductAndGalleryImageRelationShip() throws Exception {
    Product product = productRepository.findOne(1L);
    List<GalleryImage> galleryImages = product.getGalleryImages();
    assertEquals(1, galleryImages.size());
}
Run Code Online (Sandbox Code Playgroud)

但是,这个测试给了我一个 LazyInitializationException。我在 Google 和 StackOverFlow 上搜索,它说会话在 productRepository.findOne(1L) 之后关闭,因为 galleryImages 是延迟加载的,所以 galleryImages.size() 给了我这个例外。

我试图在测试中添加 @Transactional 注释,但它仍然不起作用。

Ant*_*hin 1

Hibernate 会话在以下行之后已关闭productRepository.findOne(1L)

你可以尝试做Hibernate.initialize(product.getGalleryImages())

public static void initialize(Object proxy)
                   throws HibernateException
Run Code Online (Sandbox Code Playgroud)

强制初始化代理或持久集合。注意:这仅确保代理对象或集合的初始化;不保证集合内的元素将被初始化/具体化。

为了避免这种情况,Hibernate.initialize您可以创建一个服务。

@Service
@Transactional
public class ProductService {

    @Transactional(readOnly = true)
    public List<GalleryImage> getImages(final long producId) throws Exception {
      Product product = productRepository.findOne(producId);
      return product.getGalleryImages();
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您确实Spring Data JPA在应用程序中使用,那么动态查找器是一个不错的选择。