ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【SQLIntegrityConstraintViolationException】:Duplicate entry

2021-10-22 09:03:07  阅读:159  来源: 互联网

标签:deptId SQLIntegrityConstraintViolationException getString userSame token rootObj


在这里插入图片描述

 /**
     * 同步钉钉子部门用户数据
     * 此同步方式为增量同步
     */
    @PreAuthorize(hasPermi = "system:user:sync")
    @Log(title = "同步钉钉用户数据", businessType = BusinessType.SYNC)
    @GetMapping("/syncListUserInc")
    public AjaxResult syncListUserInc() throws ApiException {
        long startTime = System.currentTimeMillis();

        SysDDToken token = userService.getToken();
        if(!DingConstant.SUCCESS_CODE.equals(token.getCode())){
            return AjaxResult.error(token.getMsg());
        }
        // 获取所有部门ID
        List<Long> longs = userService.selectDeptIdList();
        if(longs == null || longs.size() == 0 || longs.size() == 1){
            return AjaxResult.error("部门数据为空,请先同步部门数据!");
       }
        // 设置一个常规User对象
        SysUser userSame = getUserSame();
        // 遍历部门ID,循环插入
        for (Long deptId : longs) {
            insertListUserFromDDInc(token.getToken(), deptId, userSame, DingConstant.CURSOR);
        }
        long EndTime = System.currentTimeMillis();

        logger.info("同步用户数据成功,耗时:"+(EndTime-startTime)/1000+" 秒");
        return AjaxResult.success("同步用户数据成功,耗时:"+(EndTime-startTime)/1000+" 秒");
    }
    /**
     * 根据部门ID获取用户列表,递归插入
     * @throws ApiException
     */
    public void insertListUserFromDDInc(String token, Long deptId, SysUser userSame, Long cursor) throws ApiException {
        //根据部门ID获取该部门下所有用户列表
        JSONObject rootObject = userService.getListUserFromDD(token, deptId,cursor);

        // 判断是否成功
        checkIsSuccess(rootObject);

        boolean hasMore = rootObject.getJSONObject("result").getBoolean("has_more");
        Long nextCursor = rootObject.getJSONObject("result").getLong("next_cursor");

        JSONArray listArray = rootObject.getJSONObject("result").getJSONArray("list");

        if(listArray.size() > 0){
            for (Object o : listArray) {
                JSONObject s =  (JSONObject)o;

                if(UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(s.getString("mobile")))){
                    continue;
                }
                //采用系统毫秒数作为主键
                userSame.setUserId(System.currentTimeMillis());
                userSame.setDeptId(deptId);
                userSame.setUserName(s.getString("mobile"));
                userSame.setNickName(s.getString("name"));
                userSame.setEmail(s.getString("email"));
                userSame.setPhonenumber(s.getString("mobile"));
                userSame.setRemark(s.getString("title"));

                userService.insertUserFromDD(userSame);
            }
        }
        if(!hasMore){
            return;
        }
        insertListUserFromDDInc(token,deptId,userSame,nextCursor);
    }

这个问题出现的比较奇怪。

MySQL数据库中的这张表,设置的主键策略是自增长,但是当我批量插入数据时,它并没有实现自增。

准确来说,是只有第一条数据的ID实现了自增,后面的ID不再自增。

因此,我的批量插入操作,永远只能成功一条。

真是奇了怪了,试了各种方法,仍然没有解决。

索性不用数据库自增的策略,改为手动设置主键ID。

但是这个主键重复的问题是如何产生的?

我到现在仍然没有头绪。

等到这个功能完善之后,我要回头解决掉这个BUG。

因为个人能力的问题,最近的项目开发中,好多代码都没有重构,因此显得杂乱无章。

不过我加了非常详细的注释。

我一直都有个写注释的好习惯

(可能是因为我比较菜吧。)

上面这段划掉…

标签:deptId,SQLIntegrityConstraintViolationException,getString,userSame,token,rootObj
来源: https://blog.csdn.net/single_0910/article/details/120879415

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有