栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis-Plus批量插入导致的主键冲突问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis-Plus批量插入导致的主键冲突问题

场景:

        

        使用mybatis-plus进行批量插入,由于一次错误的写法,导致在版本V3.5.0之前的版本中可以插入,没有发生主键冲突的问题,但是在V3.5.0之后的版本中进行批量插入的时候发生了主键冲突的问题,错误用法如下:

 

@Test
    @Transactional(rollbackFor = Exception.class)
    public void testBatchInsert() {
        List list = new ArrayList<>();
        for (int i = 0; i < 5; i ++) {
            TUser tUser = new TUser();
            tUser.setUserName("yy" + i);
            tUser.setPassword("pp" + i);
            list.add(tUser);

            userService.saveBatch(list);
        }
    }
分析:

        分析上面的错误,由于误将saveBatch方法执行时机放到了for循环里面,导致循环进行插入的时候,第一次插入的TUser对象完成saveBatch操作之后,在list中该对象的id字段就有值了(这里TUser的id字段是自增) ,第二次再将该id有值的对象进行saveBatch操作的时候,如果是在V3.5.0之前的版本是可以插入,不会报错,但是在V3.5.0之后的版本里面是会产生主键冲突的异常,这是因为第一次saveBatch操作产生了id,第二次saveBatch操作先将没有id的对象保存这时的id还是根据数据库里已经提交的记录的最新id递增的,会和第一次saveBatch产生的id冲突

        另外,从saveBatch底层代码的逻辑可以看出,它的批量保存本质还是拆解成一条一条的insert语句进行保存

解决方案:

       将mybatis的依赖版本从3.5.0之前的版本升级到3.5.0之后的版本如下:


    com.baomidou
    mybatis-plus-boot-starter
    3.5.1

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/988115.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号