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);
        }

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

 

 


解决办法

        其实很简单,只需要将变量定义在循环体内就行,这样每轮保存的对象就不一样了,生成的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);
        }

你可能感兴趣的:(mybatis,java,mysql)