当前位置: 首页 > 知识库问答 >
问题:

测试中的Jpa和LazyInitializationException

丌官炎彬
2023-03-14
@Entity
@Table(name = "product")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "product_id")
    private Long id;
    private String productName;
    private Long productPrice;
    private String productDescription;
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "product_type_id")
    private ProductType productType;
    //getters and setters
@Entity
@Table(name = "product_type")
public class ProductType {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "product_type_id")
    private Long id;
    private String productTypeName;
    private String productTypeDescription;
    @OneToMany(mappedBy = "productType", cascade = CascadeType.ALL)
    private List<Product> products;
    //getters and setters
@Service
public class ProductService {
    ProductRepository productRepository;
    ProductTypeRepository productTypeRepository;

    public ProductService(ProductRepository productRepository, ProductTypeRepository productTypeRepository) {
        this.productRepository = productRepository;
        this.productTypeRepository = productTypeRepository;
    }

    @Transactional
    public Product saveProduct(Product product){
        return productRepository.save(product);
    }

    @Transactional
    public List<Product> findAllByProductTypeName(String type){
        ProductType productType = productTypeRepository.findByProductTypeName(type);
        return productType.getProducts();
    }
@SpringBootTest
class ProductServiceTest extends BaseDAOTest {
    @Autowired
    ProductService productService;
    @Autowired
    ProductTypeService productTypeService;

    @Test
    void findAllByProductTypeTest(){
        Product product = new Product("Test product", 100L, "Test product description");
        product.setProductType(new ProductType("Test type", "Test description"));
        productService.saveProduct(product);
        List<Product> productList = productService.findAllByProductTypeName("Test type");
        productList.get(0);
    }
}
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.krasovsky.warehouse.models.ProductType.products, could not initialize proxy - no Session

    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:606)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:218)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:149)
    at org.hibernate.collection.internal.PersistentBag.get(PersistentBag.java:561)

解决这个问题的正确方法是什么?如果你需要任何额外的信息,请说。提前谢了。

共有1个答案

左劲
2023-03-14

您正试图在事务之外进行提取。您需要使用@datajpatest注释您的测试类:

默认情况下,数据JPA测试是事务性的,并在每个测试结束时回滚

https://docs.spring.io/spring-boot/docs/1.5.2.release/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications-testing-autocomputed-jpa-test

 类似资料:
  • 我正在尝试在Spring Boot应用程序中使用Spring数据、Hibernate Envers和审计。我已配置AuditorAwareImpl 和配置类。 现在我想为集成测试创建AuditorAware。我已经用test auditor创建了新的配置类 但是在添加之后,它的工作方式是I excepted-返回。所以最后我的测试类看起来是: 现在我真的很困惑bean是如何在特定的概要文件中使用的

  • 问题内容: 在最近的工作中,我使用spring-data- jpa来利用提供的存储库。在进行集成测试时,我无法配置(我假设)用于测试的Spring上下文,因此结果Bean验证在我的测试中不起作用。 我知道我可以注入验证器,并对注释进行单元测试,但事实并非如此。我正在编写集成测试,并且想测试具有数据库支持的存储库。 我准备了一个简单的项目来显示所有必要的项目文件。 当我运行测试时,2失败了,我也不知

  • 在我最近的工作中,我使用SpringDataJPA来利用提供的存储库。当涉及到集成测试时,我无法配置(我假设)用于测试的spring上下文,结果bean验证在我的测试中不起作用。 我知道我可以注入验证器和单元测试我的注释,但事实并非如此。我正在编写集成测试,并希望测试数据库支持的存储库。 我准备了一个简单的项目来显示所有必要的项目文件。 当我运行测试时,有2个测试失败,我不知道为什么,hibern

  • 首先所有的包都应该有一定的必要文档,然后同样重要的是对包的测试。 在第 3 章中提到了 Go 的测试工具 gotest, 我们已经在 9.8 节中使用过了。这里我们会用更多的例子进行详细说明。 名为 testing 的包被专门用来进行自动化测试,日志和错误报告。并且还包含一些基准测试函数的功能。 备注:gotest 是 Unix bash 脚本,所以在 Windows 下你需要配置 MINGW 环

  • 与许多Java应用程序一样,我们在应用程序中使用Freemarker来呈现电子邮件。我们发现我们的一些模板并没有像我们想象的那样呈现,因此我们意识到我们应该为模板呈现编写一些单元测试。我设置了测试,并立即收到一个FileNotFoundException:找不到模板“my/Template.ftl”。 我想这一定是一个既能解决问题又能轻松解决的问题。那是很多小时前的事了,我意识到我错了;据我所知,

  • 问题内容: 我知道这个问题在这里和整个互联网上已经被问过无数次了,我已经阅读了许多答案,但是我仍然不了解解决这个问题的正确方法。我正在尝试使用Spring MVC和JPA,并且每次访问延迟加载的属性时,都会得到LazyInitializationException。 这是我正在尝试的一些代码: 我正在访问的实体: 从DOI引用的实体 Spring MVC控制器: 我的Spring配置: 和堆栈跟踪