问题描述
当使用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);
}