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
相关产品推荐
相关产品推荐

