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

Spring Boot 调用save()后数据未同步到数据库 查询返回旧值问题

原因分析

1. H2控制台看不到新增数据的原因

Spring测试框架默认对标注了@Transactional的测试方法开启自动回滚,所有数据库操作都不会真正提交到持久化存储。你调试时看到的新增数据仅存在于事务上下文和JPA的一级缓存中,事务未提交的情况下H2控制台无法查询到未持久化的内存数据。

2. 查询返回标签数不符合预期的原因

  • 关联缓存未更新:如果getTagsForPlannedRecipe方法内部是通过PlannedRecipes实体的关联集合返回标签,你新增TagToPlannedRecipe中间表实体时,仅设置了关联实体的属性,没有主动将新增的Tag同步到PlannedRecipes实例的关联集合中,JPA一级缓存中的PlannedRecipes对象仍为初始状态,所以返回的标签数还是2。
  • Tag类相等性判断逻辑错误:代码中currentTags.contains(t)的判断依赖Tag类的equals方法,默认equals方法对比的是对象内存地址,你新构建的Tag对象和数据库查询出的Tag对象即使tag字段值一致也会被判定为不同对象,可能导致重复新增或者判断逻辑异常。

解决方案

  • 排查getTagsForPlannedRecipe的实现逻辑,若基于实体关联集合返回数据,新增关联后主动更新PlannedRecipes的关联集合,或在查询前调用entityManager.clear()清除一级缓存,强制从数据库查询最新数据。
  • 为Tag类重写equals和hashCode方法,基于tag字段做相等性判断。
  • 若需要在测试过程中查看H2数据库的持久化数据,可给测试方法添加@Rollback(false)注解,关闭测试自动回滚机制。
  • 调用getTagsForPlannedRecipe前可手动触发Repository的flush()方法,确保所有操作已同步到数据库。

内容的提问来源于stack exchange,提问作者uniqueuser-programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:54:04