jdbcTemplate执行sql后数据库字段没有更新问题解决

问题大致如下:

postgre数据库,jsonb字段,由于mapper层用的是mybatis,而mybatis的JSQLParser无法解析mapper.xml文件中的jsonb更新语法,所以无法直接用sql更新jsonb字段中的json内容,于是我使用jdbcTemplate执行原生sql来更新这个字段的值。

问题是:显示执行成功,但是字段置未被更新。但我把日志中的sql和参数拿去dbever执行都可以正确更新字段值,但是偏偏在项目中无法正确更新,也不报错,原生sql执行也没问题,也正确返回了影响行数,但数据库的字段就是没有变化。

问题原因:

我的调用顺序:1.mapper.update();2.原生sql;这个调用顺序导致了问题出现,原因是我在第一步调用mapper.update的时候,虽然执行成功,但数据库事务尚未提交,也就是说,更新只存在于mybatis的一级缓存中,并未真实发生在数据库。而我的第二个原生SQL并未被mybatis事务管理器管理,直接绕过了管理器在数据库发生了真实变更。而当原生sql执行完,第一步的mapper.update方法的事务才被提交,此时一级缓存中的旧值覆盖了我原生SQL修改过的值,所以出现了这个问题。

解决办法:

1.先执行原生SQL,再执行mybatis方法

2.执行完原生SQL后,需要重新查询一下待mybatis方法更新的数据,防止覆盖

相关推荐
坚持就完事了5 分钟前
数据结构之树(Java实现)
java·算法
Monly218 分钟前
Java:修改打包配置文件
java·开发语言
roman_日积跬步-终至千里8 分钟前
【架构设计与实现】动态数据源切换:核心代码实现手册
java
XiaoFan01217 分钟前
免密批量抓取日志并集中输出
java·linux·服务器
顾北1223 分钟前
MCP服务端开发:图片搜索助力旅游计划
java·spring boot·dubbo
山岚的运维笔记27 分钟前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
我命由我1234530 分钟前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
赛姐在努力.31 分钟前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
yxc_inspire35 分钟前
Java学习第二天
java·面向对象
毕设源码-赖学姐37 分钟前
【开题答辩全过程】以 基于net超市销售管理系统为例,包含答辩的问题和答案
java