Mybatis-plus框架 出现添加数据时主键冲突问题的解决办法 ASSIGN_ID出现重复值的问题_数据库里是空的,但是mybatis plus提示主键重复-程序员宅基地

技术标签: java  mybatis  mysql  

问题描述

        当使用Mybatis-plus的ASSIGN_ID主键生成策略时,出现两条数据id相同,导致添加不进数据库的问题,根据ASSIGN_ID生成策略原理,一毫秒的时间可以生成4096个不同主键(数据来源),实际使用上基本不可能出现重复id,但是却出现了,下面这个回答可能会解决你的问题。


问题分析

        根据我的实验结果,我发现使用同一个对象当做save方法的形参[xxxService.save(对象)] 进行保存的时候会出现主键相同的情况

        Iterator iterator = setMealDishes.iterator();
        //下面是该重复使用的对象
        SetMealDish setmealDish = new SetMealDish();
        while (iterator.hasNext()) {
            LinkedHashMap next =  (LinkedHashMap)iterator.next();
            String dishId = (String)next.get("dishId");
            setmealDish.setDishId(new Long(dishId));
            setmealDish.setSetmealId(oneOfSetMeal.getId());
            setmealDish.setName((String) next.get("name"));
            setmealDish.setPrice((Integer) next.get("price"));
            setmealDish.setCopies((Integer) next.get("copies"));
            //可以看到,本质上是一个对象,只是变换变量的值,然后save时生成的主键相同
            setMealDishService.save(setmealDish);
        }

 

 


解决办法

        其实很简单,只需要将变量定义在循环体内就行,这样每轮保存的对象就不一样了,生成的id也就不同

 Iterator iterator = setMealDishes.iterator();
        while (iterator.hasNext()) {
            //将对象定义在循环体内
            SetMealDish setmealDish = new SetMealDish();
            LinkedHashMap next =  (LinkedHashMap)iterator.next();
            String dishId = (String)next.get("dishId");
            setmealDish.setDishId(new Long(dishId));
            setmealDish.setSetmealId(oneOfSetMeal.getId());
            setmealDish.setName((String) next.get("name"));
            setmealDish.setPrice((Integer) next.get("price"));
            setmealDish.setCopies((Integer) next.get("copies"));
            setMealDishService.save(setmealDish);
        }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/f131619_0/article/details/126738387

智能推荐

uboot device tree宏定义_config_default_device_tree-程序员宅基地

文章浏览阅读1.3k次。了解 uboot device tree 宏定义(README.fdt-control)1.CONFIG_OF_CONTROL  To enable this device tree feature, add CONFIG_OF_CONTROL to your board config file.2.CONFIG_DEFAULT_DEVICE_TREE  To set the file..._config_default_device_tree

Unity全局光照/Bake GI/Precomputed Real-time GI/Lightmap/Light Probe_csdn unity 动态物体 静态光照-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏18次。目录Baked GILightmap和Light ProbePrecomputed Real-time GIUnity的全局光照系统采用Enlighten解决方案,包含Baked GI和Precomputed Real-time GI系统。在不开启全局光照时,Unity的光源只产生直接光照的效果,没有任何间接光照。Baked GIBaked GIBaked GI采用一个离线的烘焙过程,将静态物体接收到的光照信息存入Lightmap中储存。由于烘焙是离线的过程,可以耗费时间来计算复杂的间接光照,将结果_csdn unity 动态物体 静态光照

Javascript 产生随机数——服从均匀分布随机数、服从正态分布(高斯分布)随机数、服从柯西分布随机数_js 正态分布随机数-程序员宅基地

文章浏览阅读3.6k次,点赞6次,收藏16次。Javascript 产生服从均匀分布随机数大家都知道Math.random是 javascript 中返回伪随机数的方法,但Math.random()产生 [0,1)区间的随机数(注意,不包括1),如果要取到1,可以这样:Math.floor(Math.random()*2);,取到 [0,2)之间的数然后向下取整。Box-Muller变换是通过服从均匀分布的随机变量,来构建服从正态分布的随机变量的一种方法。_js 正态分布随机数

Keras实现层的分离_keras输入图像通道分离-程序员宅基地

文章浏览阅读522次。前言笔者最近在复现Shufflenet Mobilenet 和谷歌最新推出的EfficientNet结构发现各大网络都在往轻巧化方向发展其中一个很关键的,就是Depthwise卷积结构的提出,可以参考我上篇博客而其中Depthwise卷积需要对单独的通道在做一次卷积,而不是多通道上进行累加因此这就涉及到了通道的分离下面我们直接来看代码代码实现import kerasfrom ke..._keras输入图像通道分离

SpringBoot 整合Swagger2 启动异常documentationPluginsBootstrapper NullPointerException_org/springframework/boot/bootstrapper-程序员宅基地

文章浏览阅读815次。SpringBoot 整合Swagger2 启动异常org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException_org/springframework/boot/bootstrapper

IntelliJ IDEA 下载安装配置教程(完整版)_idea安装教程-程序员宅基地

文章浏览阅读10w+次,点赞438次,收藏2.2k次。IntelliJ IDEA 下载安装教程参考:https://blog.csdn.net/HD_hjx/article/details/89931754number_one:官网下载 IntelliJ IDEAnumber_two:开始安装的旅途吧!_idea安装教程

随便推点

LLVM IR:从中间文件提取struct信息_解析头文件结构体-程序员宅基地

文章浏览阅读1.3k次。LLVM IR:从中间文件提取struct信息先放上源代码:struct demo1 { long long A; long long B;};struct demo2 { long long C; long long D; float E;};int main(){ struct demo1 d1; struct demo2 d2; d1.A = 1; d2.C = 2; d2.D = d1.A + d2.C; return 0;_解析头文件结构体

MATLAB 画图_plot(t,y),y为矩阵-程序员宅基地

文章浏览阅读1.2k次。MATLAB第一节 图形窗口与坐标系一.图形窗口 1.MATLAB在图形窗口中绘制或输出图形,因此图形窗口就像一张绘图纸. 2. 在MATLAB下,每一个图形窗口有唯一的一个序号h,称为该图形窗口的句柄.MATLAB通过管理图形窗口的句柄来管理图 形窗口; 3.当前窗口句柄可以由MATLAB函数gcf获得; 4.在任何时刻,只有唯一的一个窗口是当前的图形 窗口(活跃窗口); ..._plot(t,y),y为矩阵

C#加壳工具做代码加密保护_c# exe代码加固-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏17次。当前C# .net语言的应用范围越来越广泛,IIS 的服务器架构后台代码、桌面应用程序的 winform 、Unity3d 的逻辑脚本都在使用。C# .net 具备强大的便捷特性,使得开发成本极低。而作为一款.net 语言,也有它让开发者头疼的弊病——非常容易被反编译。市面上的 Dnspy, ILspy,de4dot等工具可以非常容易反编译出被混淆保护的C# .net 程序。解决方案深思自..._c# exe代码加固

C++ 使用fdk-aac对音频编码-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏11次。mp4的音频流通常是aac编码,我们做音视频采集的时候就需要将,采集的音频PCM编码成aac,然后再打包进mp4,而aac编解码库中fdk-aac是性能较好的,使用方式也比较简单。在C++项目中使用,通常再做一层封装,提高模块的复用性和替换性。本文将展示C++将fdk-aac封装成一个编码对象,以及使用示例。_fdk-aac

关于PyCharm 中使用sqlite创建数据库表,表不显示的问题。_pycharm sqlite中找不到migrate的表-程序员宅基地

文章浏览阅读1w次,点赞9次,收藏7次。1.问题:在pycharm中将爬取的数据通过sqlite3保存在数据库表中,数据库名称为:film.sqlite3,创建表名为:filmtop250。过程为import sqlite3film = sqlite3.connect('film.sqlite3')create_table = 'create table filmtop250(rank integer,title varc..._pycharm sqlite中找不到migrate的表

BZOJ 1434: [ZJOI2009]染色游戏 博弈_一共n × m 个硬币,摆成n × m 的长方形。dongdong 和xixi 玩一个游戏, 每次可-程序员宅基地

文章浏览阅读872次。[Submit][Status][Discuss] Description 一共n × m 个硬币,摆成n × m 的长方形。dongdong 和xixi 玩一个游戏, 每次可以选择一个连通块,并把其中的硬币全部翻转,但是需要满足存在一个 硬币属于这个连通块并且所有其他硬币都在它的左上方(可以正左方也可以正 上方),并且这个硬币是从反面向上翻成正面向上。dongdong 和xixi 轮流操作。_一共n × m 个硬币,摆成n × m 的长方形。dongdong 和xixi 玩一个游戏, 每次可以

推荐文章

热门文章

相关标签