saveBatch时 遇到Duplicate entry '1828978156126666754' for key
问题:saveBatch时 遇到Duplicate entry '1828978156126666754' for key
分析:1.检查数据库里是否有重复ID
2.检查代码中是否有id赋值
3.
以上排查都没发现问题,以下代码分析了一下,为了节省空间,我在for循环上面new了一个封装类,
执行for时,把封装类放到了数组,但是数组里放的其实都是同一个对象,这样saveBatch的时候,第一次执行成功时,
会把id写回该对象,同时list中元素的id值,也将被改变为同一个。
解决:
放入List中的元素,要保证是不同的对象
错误代码:
AssetLedger assetsLedger = new AssetLedger(); assetsLedger.setBrand(brand); assetsLedger.setModel(model); assetsLedger.setAssetsName(assetsName); assetsLedger.setPriority(1); BeanUtil.packAddBaseProps(assetsLedger, request); if (entryNum > residueNum) { entryNum -= residueNum; assetsEntryService.reduceResidueNum(assetEntryVO.getId(), residueNum); for (int j = 0; j < residueNum; j++) { assetsLedger.setEntryId(assetEntryVO.getId()); assetsLedger.setReceiveId(receifeId); assetsLedger.setState(LedgerStateEnum.RECIVE.getValue()); assetsLedger.setUserId(assetReceifeDTO.getReceiveUser()); assetsLedger.setNumber(1); assetsLedger.setId(null); assetsLedgers.add(assetsLedger); } } assetLedgerService.saveBatch(assetsLedgers);
正确代码:
for (int j = 0; j < residueNum; j++) { AssetLedger assetsLedger = new AssetLedger(); assetsLedger.setBrand(brand); assetsLedger.setModel(model); assetsLedger.setAssetsName(assetsName); assetsLedger.setPriority(1); BeanUtil.packAddBaseProps(assetsLedger, request); assetsLedger.setEntryId(assetEntryVO.getId()); assetsLedger.setReceiveId(receifeId); assetsLedger.setState(LedgerStateEnum.RECIVE.getValue()); assetsLedger.setUserId(assetReceifeDTO.getReceiveUser()); assetsLedger.setNumber(1); assetsLedger.setId(null); assetsLedgers.add(assetsLedger); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?