SpringBoot 2.7.0升级后测试抛出StaleStateException异常问题
Spring Boot 2.6.8升级2.7.0测试异常问题
基础背景
项目核心依赖如下:
spring-boot-starter-data-jpaspring-boot-starter-securityspring-boot-starter-web- Flyway
- H2(测试数据库)
- Spring Boot Test
测试类通过自定义@ApplicationTest组合注解整合@SpringBootTest与@ActiveProfiles("test")注解实现测试环境配置。
核心异常表现
从2.6.8版本升级至2.7.0版本后,运行测试触发旧版本从未出现的报错:
- 核心异常:
org.springframework.orm.ObjectOptimisticLockingFailureException - 嵌套异常:
org.hibernate.StaleStateException - 错误提示:批量更新返回不符合预期的行数,执行
delete from account where id=?语句时期望影响行数为1,实际影响行数为0 - 触发位置:
ResetPasswordServiceTest测试类中@AfterEach注解标注的tearDown方法,该方法调用accountRepository.deleteAll()执行测试后的数据清理逻辑 - 触发链路:
@BeforeEach标注的初始化方法创建AccountEntity实例并通过accountRepository.save()存入H2测试数据库,测试方法内部调用passwordService.resetPassword()业务逻辑(逻辑内部会读取账户仓储数据),执行完成后进入清理逻辑触发异常 - 影响范围:除该测试外,其余多个测试用例存在同类报错
已尝试的排查与验证
- 给测试类添加
@Transactional注解:可修复部分异常,但会引发实体关联关系无法加载的新问题,无法作为最终方案 - 查阅Spring Boot 2.7官方升级发布说明:未找到对应破坏性变更记录
- 公开检索同类异常:返回结果大多为不相关场景,无法定位问题根因
- 替换测试数据库:将测试数据库从H2替换为HSQLDB后,大部分异常修复,但仍存在自定义更新方法执行失效问题
剩余未解决问题
标注@Modifying(clearAutomatically = true)的自定义JPQL更新方法setUserEmail存在执行异常:
- 方法逻辑:根据id和
isApproved=false条件更新AccountEntity的email字段 - 现象:执行日志显示SQL语句正常输出、参数绑定正确,但方法返回影响行数为0,数据库中对应数据未实际更新
内容的提问来源于stack exchange,提问作者user1126068
相关产品推荐
相关产品推荐

