数据库
首页 > 数据库> > 【SQLIntegrityConstraintViolationException】:Duplicate entry

【SQLIntegrityConstraintViolationException】:Duplicate entry

作者:互联网

在这里插入图片描述

 /**
     * 同步钉钉子部门用户数据
     * 此同步方式为增量同步
     */
    @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