当前位置: 首页 > news >正文

【异常】因为忘加了租户查询条件,导致重复ID导入失败Duplicate entry ‘XXX‘ for key ‘PRIMARY‘

一、异常说明

 Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '670' for key 'PRIMARY'The error may exist in /mall/admin/mapper/GoodsCategoryMapper.java (best guess)The error may involve .admin.mapper.GoodsCategoryMapper.insert-InlineThe error occurred while setting parametersSQL: INSERT INTO goods_category (id, tenant_id, enable, parent_id, name, sort, create_time, update_time, del_flag) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '670' for key 'PRIMARY'
; Duplicate entry '670' for key 'PRIMARY'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '670' for key 'PRIMARY'at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:247)at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)at com.sun.proxy.Proxy185.insert(Unknown Source)

二、看看代码逻辑

出错的代码逻辑,其实就是个存类目信息到数据库的逻辑

public void saveGoodsCategory(GoodsCategoryImportDTO goodsCategoryImportDTO) {JSONArray goodsCategoryJsonArray = getJSONArray(goodsCategoryImportDTO);for (int i = 0; i < goodsCategoryJsonArray.size(); i++) { List<GoodsCategory> goodsCategoryList = baseMapper.selectList(Wrappers.<GoodsCategory>lambdaQuery().eq(GoodsCategory::getId, JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("id")));//重复类目数据的过滤if (ObjectUtil.isNotEmpty(goodsCategoryList)) {log.info("重复类目数据:levelOneCategoryId = [{}],导入失败,类目数据记录已经存在", goodsCategoryImportDTO.getLevelOneCategoryId());continue;}GoodsCategory goodsCategory = new GoodsCategory();goodsCategory.setId(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("id"));goodsCategory.setName(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("name"));goodsCategory.setParentId(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("parentId"));int sortSize = getSort(GOODS_CATEGORY_JD_KEY);goodsCategory.setSort(sortSize);addSize(GOODS_CATEGORY_JD_KEY);goodsCategory.setTenantId(jDConfigProperties.getTenantId());goodsCategory.setEnable(CommonConstants.YES);goodsCategory.setCreateTime(LocalDateTime.now());goodsCategory.setDelFlag(DelFlagEnum.SHOW.getValue());goodsCategory.setDescription(ProductChannelEnum.JINGDONG.getDesc());baseMapper.insert(goodsCategory);}
}

因为ID设置了主键,因此,当ID重复时,就会提示已经重复了,Duplicate entry '670' for key 'PRIMARY'
故,新增了如下查询逻辑, 用于插入前判断,防止重复导入。

List<GoodsCategory> goodsCategoryList = baseMapper.selectList(Wrappers.<GoodsCategory>lambdaQuery().eq(GoodsCategory::getId, JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("id"))
);
//重复类目数据的过滤
if (ObjectUtil.isNotEmpty(goodsCategoryList)) {log.info("重复类目数据:levelOneCategoryId = [{}],导入失败,类目数据记录已经存在", goodsCategoryImportDTO.getLevelOneCategoryId());continue;
}

但是,这段逻辑,却永远不会进入到if判断语句中。这样就不会按照语句希望的那样,继续下一个循环。
那,为什么不会进到if判断语句中呢?原因就肯定是那段Mybatis的逻辑有问题啦。
怎么看Mybatis的实时输出的SQL脚本呢?IDEA有个插件能帮到你。
【项目实战】IDEA插件推荐——Mybatis Log Plugin查看Mybatis实时输出的SQL脚本

因为项目是基于多租户架构实现的,因此我们编写的Mybatis的脚本一般都需要加上租户信息,才能查询出来结果

本项目中多租户的实现方式,见以下技术文章
【项目实战】商城中多租户功能逻辑设计

三、问题解决

定位了问题,解决就快了呢。直接加上租户进查询条件即可,如下

 @Override
public void saveGoodsCategoryShop(GoodsCategoryImportDTO goodsCategoryImportDTO) {JSONArray goodsCategoryJsonArray = getJSONArray(goodsCategoryImportDTO);for (int i = 0; i < goodsCategoryJsonArray.size(); i++) {// 设置租户IDTenantContextHolder.setTenantId(jDConfigProperties.getTenantId());List<GoodsCategoryShop> goodsCategoryShopList = baseMapper.selectList(Wrappers.<GoodsCategoryShop>lambdaQuery().eq(GoodsCategoryShop::getId, JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("id")));//重复类目数据的过滤if (ObjectUtil.isNotEmpty(goodsCategoryShopList)) {log.info("重复店铺类目数据:levelOneCategoryId = [{}],导入失败,店铺类目数据记录已经存在", goodsCategoryImportDTO.getLevelOneCategoryId());continue;}GoodsCategoryShop goodsCategoryShop = new GoodsCategoryShop();goodsCategoryShop.setId(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("id"));goodsCategoryShop.setName(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("name"));goodsCategoryShop.setParentId(JSONUtil.parseObj(goodsCategoryJsonArray.get(i)).getStr("parentId"));int sortSize = getSort(GOODS_CATEGORY_SHOP_JD_KEY);goodsCategoryShop.setSort(sortSize);addSize(GOODS_CATEGORY_SHOP_JD_KEY);goodsCategoryShop.setShopId(jDConfigProperties.getShopId());goodsCategoryShop.setTenantId(jDConfigProperties.getTenantId());goodsCategoryShop.setEnable(CommonConstants.YES);goodsCategoryShop.setCreateTime(LocalDateTime.now());goodsCategoryShop.setDelFlag(DelFlagEnum.SHOW.getValue());goodsCategoryShop.setDescription(ProductChannelEnum.JINGDONG.getDesc());baseMapper.insert(goodsCategoryShop);}
}

注意:重点是加了这一句!

 // 设置租户ID
TenantContextHolder.setTenantId(jDConfigProperties.getTenantId());

加了之后,就可以正常进if分支咯。至此,问题解决!

相关文章:

【异常】因为忘加了租户查询条件,导致重复ID导入失败Duplicate entry ‘XXX‘ for key ‘PRIMARY‘

一、异常说明 Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 670 for key PRIMARYThe error may exist in /mall/admin/mapper/GoodsCategoryMapper.java (best guess)The error may involve .admin.mapper.GoodsCate…...

证明CPU指令是乱序执行的

承接上文CPU缓存一致性原理双击QQ.exe从磁盘加载到内存里面&#xff0c;内存里面就会有了一个进程&#xff0c;进程产生的时候会产生一个主线程&#xff0c;就是main方法所在的线程&#xff0c;cpu会找到main开始的地方&#xff0c;把它的指令读取过来放到程序计数器&#xff0…...

css 属性和属性值的定义

文章目录css文本属性作业列表属性背景属性作业css文本属性 序号属性描述说明1font-size字体大小浏览器默认16px&#xff1b;2font-family字体当字体是中文字体&#xff0c;英文字体&#xff0c;中间有空格时候&#xff0c;要加双引号&#xff0c;多字体之间用逗号隔开 默认微软…...

Python获取中国大学MOOC某课程评论及其参与人数

文章目录前言一、需求二、分析三、运行结果前言 本系列文章来源于真实的需求本系列文章你来提我来做本系列文章仅供学习参考 一、需求 1、课程参加人数 2、课程学员名称及其评论 二、分析 首先查看网页源代码是否有需要的数据 课程参加人数 课程学员名称及其评论 F12 打开浏…...

【C++】类和对象(完结篇)

文章目录1. 再谈构造函数1.1 初始化列表1.2 explicit关键字2. static 成员2.1 静态成员变量2.1 静态成员函数2.3 练习2.4 总结3. 匿名对象4. 友元4.1 友元函数4.2 友元类5. 内部类6. 拷贝对象时编译器的一些优化7. 再次理解类和对象这篇文章呢&#xff0c;我们来再来对类和对象…...

低代码开发可以解决哪些问题?

低代码开发可以解决哪些问题&#xff1f;如果用4句话去归纳&#xff0c;低代码开发可以解决以下问题—— 为企业提供更高的灵活性&#xff0c;用户可以突破代码的限制自主开发业务应用&#xff1b;通过减少对专业软件开发人员的依赖&#xff0c;公司可以快速响应市场上的新业务…...

Linux 中使用 docker-compose 部署 MongoDB 6 以上版本副本集及配置 SSL / TLS 协议

一、准备环境 MongoDB 副本集部署至少 3 个节点&#xff08;奇数节点&#xff09;&#xff0c;为了保障数据安全性&#xff0c;可考虑将 MongoDB 节点分布在不同的主机上&#xff0c;本示例使用一台主机部署 3 个 MongoDB示例。 1、创建 MongoDB 集群数据相关目录 # 创建 Mo…...

JavaWeb--Mybatis练习

Mybatis练习Mybatis练习1 配置文件实现CRUD1.1 环境准备1.2 查询所有数据1.2.1 编写接口方法1.2.2 编写SQL语句1.2.3 编写测试方法1.2.4 起别名解决上述问题1.2.5 使用resultMap解决上述问题1.2.6 小结1.3 查询详情1.3.1 编写接口方法1.3.2 编写SQL语句1.3.3 编写测试方法1.3.4…...

Springer-MTA期刊上传Latex要求

https://blog.csdn.net/qq_40721108/article/details/129000957本文简述比较全面Please provide any additional items.If your data are available online, for example in a repository, you can add a weblink using the “Link(s) to supporting data” option from the dr…...

Graph Embedding基础 图表示学习 什么是Graph Embedding

本文包括 DeepWalk LINE SDNE Node2vec Struc2vec等几个重要的Graph Embedding 方法 先说下不同embedding的区别是什么&#xff1a; DeepWalk&#xff1a;采用随机游走&#xff0c;形成序列&#xff0c;采用skip-gram方式生成节点embedding。node2vec&#xff1a;不同的随机游…...

某直聘tp_token解析

尊重版权&#xff0c;请勿盗版&#xff0c;不放代码。截至2023-02-23更新---------------------------------------检测windows属性总数大于150 改成大于15 > 150检测了document属性大于50检测了navigate属性检测了navigate.plugins 属性值检测moudle nodejs是否存在&#x…...

替代启攀微8按键触控八通道触摸芯片-GTC08L

能完美替代启攀微8按键触控八通道电触摸芯片-GTC08L芯片是一款非常适用于音响上超稳定超抗干扰低功耗八通道电容式触摸IC&#xff1b;可通过触摸实现各种逻辑功能控制&#xff1b;操作简单、方便实用&#xff1b;电压范围宽&#xff0c;可在2.7V&#xff5e;5.5V&#xff08;单…...

Zabbix“专家坐诊”第182期问答汇总

问题一&#xff1a; Q&#xff1a;像烽火、浪潮这种没有ilo的设备怎么监控他们的硬件状态呢&#xff1f; A&#xff1a;如果没有ilo&#xff0c;可以使用其他硬件监控软件&#xff0c;例如HP Insight Manager、IBM Director、Dell OpenManage等。这些软件可以帮助您监控硬件状…...

PHP、Nginx、openssl ECC证书搭建

在一台Ubuntu中#!/bin/bash# 安装 Nginxsudo apt-get updatesudo apt-get install nginxsudo apt-get install libssl-devsudo apt-get install -y nginx# 配置 Nginxsudo ufw allow Nginx HTTPsudo systemctl start nginxsudo systemctl enable nginx# 安装 PHPsudo apt-get i…...

秒杀服务------技术点及亮点

大技术使用Redisson使用Redisson在秒杀服务中有两个作用&#xff0c;一个是作为分布式锁来确保多个秒杀服务同时在线时同时上架秒杀商品&#xff0c;只允许有一个秒杀服务成功上架秒杀商品&#xff0c;其他的上架失败。第二个作用是作为分布式信号量&#xff0c;每个秒杀商品在…...

【Python数据挖掘入门】一、数据挖掘概况

一、数据挖掘概况 数据挖掘是指从大量的数据中&#xff0c;通过统计学、人工智能、机器学习等方法&#xff0c;挖掘出未知的、具有价值的信息和知识的过程。 典型案例&#xff1a; 啤酒与尿布杜蕾斯与口香糖杜蕾斯与红酒 数据挖掘是一门交叉学科&#xff0c;覆盖了统计学、数…...

【python】anaconda 管理 python 环境

anaconda 管理虚拟环境anaconda 简介python 虚拟环境的安装查看当前 anaconda中所有的虚拟环境创建新的虚拟环境激活所创建的虚拟环境删除指定的虚拟环境退出当前虚拟环境查看当前虚拟环境中所有安装的库安装常用包pycharmpycharm 下环境配置pycharm 使用anaconda 简介 anacon…...

线上插画培训班有用吗,教你选靠谱的插画课程

线上插画培训班有用吗&#xff0c;教你选靠谱的插画课程&#xff0c;推荐5个靠谱的动漫插画培训课程&#xff0c;各有特色和优势&#xff0c;相信可以给大家一些参考&#xff01; 一&#xff1a;5个靠谱的动漫插画网课 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日…...

吃鸡用什么蓝牙耳机效果好?手游吃鸡公认最好的几款蓝牙耳机

蓝牙耳机的作用很多&#xff0c;几乎每个人都需要一副很棒的耳机在通勤或锻炼途中使用&#xff0c;并且玩游戏也少不了它&#xff0c;手游近几年十分的流行&#xff0c;下面整理了几款性能不错的蓝牙耳机。 第一款&#xff1a;南卡小音舱蓝牙耳机 蓝牙版本&#xff1a;5.3 发…...

四个步骤在CRM系统中设置游戏化机制

长期高强度的单一工作会让销售人员逐渐失去对工作的兴趣&#xff0c;导致销售状态缺少动力和激情&#xff0c;工作开展愈加困难。不少企业通过CRM销售管理系统设置游戏化竞赛&#xff0c;调动销售人员的工作积极性。那么&#xff0c;如何在CRM系统中设置游戏化机制&#xff1f;…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...