You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot 2.7.0升级后测试抛出StaleStateException异常问题

Spring Boot 2.6.8升级2.7.0测试异常问题

基础背景

项目核心依赖如下:

  • spring-boot-starter-data-jpa
  • spring-boot-starter-security
  • spring-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:09:31