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方法更新的数据,防止覆盖

相关推荐
海梨花2 分钟前
快手面试高频算法题
java·算法·面试
云烟成雨TD11 分钟前
Spring AI 1.x 系列【37】RAG 知识库平台案例:知识库管理
java·人工智能·spring
珠***格11 分钟前
实操落地|防逆流装置的安装规范、调试标准与故障处置
网络·数据库·人工智能·分布式·能源·边缘计算
KANGBboy14 分钟前
java知识四(面向对象编程)
android·java·开发语言
tongluowan00721 分钟前
ThreadLocal,InheritableThreadLocal,TransmittableThreadLocal详解
java·多线程·上下文
qq_2518364571 小时前
基于java Web 日化商超库存管理系统设计与实现
java·开发语言·前端
Omics Pro1 小时前
3种蛋白结构输入方式!已申报欧洲发明专利
数据库·人工智能·python·机器学习·plotly
破土士V1 小时前
【Java基础语法10】继承、多态、抽象类接口、字符串与异常等
java·开发语言
轻刀快马1 小时前
撕开 Spring 的底裤:解析 Bean 生命周期与三级缓存的“破局”之术
java·spring·缓存
KobeSacre1 小时前
JVM ZGC
java·开发语言·jvm