Mybatis-plus框架 出现添加数据时主键冲突问题的解决办法 ASSIGN_ID出现重复值的问题

问题描述

        当使用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);
        }

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值