【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。
因为个人能力的问题,最近的项目开发中,好多代码都没有重构,因此显得杂乱无章。
不过我加了非常详细的注释。
我一直都有个写注释的好习惯
(可能是因为我比较菜吧。)
上面这段划掉…