Spring Boot 3.3.x复合键测试失败,3.2.x正常,是否为预期行为?
Spring Boot 3.3.x中Spring Data JPA复合键测试失败问题
问题描述
我有一个包含复合键ProductRatingId(由CustomerId和ProductId组成)的ProductRating实体,对应的测试在Spring Boot 3.2.0中可正常通过,但升级到Spring Boot 3.3.2后测试失败。
测试代码如下:
@Test public void testCreateProductRating() { // 创建并保存Product Product product = Product.builder() .name("Test Product") .build(); product = productRepository.save(product); // 创建并保存Customer Customer customer = Customer.builder() .name("Test Customer") .build(); customer = customerRepository.save(customer); // 创建ProductRating ProductRating productRating = ProductRating.builder() .id(new ProductRatingId()) // 在Spring Boot 3.3.x中此处导致失败 .customer(customer) .product(product) .rating(10) .build(); productRatingRepository.save(productRating); // 断言评分已正确保存 assertThat(productRating).isNotNull(); assertThat(productRating.getId().getProductId()).isNotNull(); assertThat(productRating.getId().getCustomerId()).isNotNull(); assertThat(productRating.getRating()).isEqualTo(10); assertThat(productRating.getCustomer().getName()).isEqualTo("Test Customer"); assertThat(productRating.getProduct().getName()).isEqualTo("Test Product"); }
调查结果
- 若在保存
ProductRating前,显式给ProductRatingId中的customerId和productId赋值,测试可通过,但这种操作在Spring Boot 3.2.x中并非必需。 - 若将保存操作的返回值重新赋值给
productRating变量,测试在Spring Boot 3.3.2中也可通过:
productRating = productRatingRepository.save(productRating);
调整后,ProductRatingId中的customerId和productId字段会被正确填充,断言全部通过。
疑问
这种行为在Spring Boot 3.3.x中是否属于预期?Hibernate或Spring Data JPA在两个版本间的哪些变更导致了这个问题?
补充信息
- Spring Boot 3.2.0版本下测试执行通过,Spring Boot 3.3.2版本下相同测试执行失败
- 相关示例代码可在对应仓库的不同分支中查看
内容的提问来源于stack exchange,提问作者henriquels
相关产品推荐
相关产品推荐

