批量导入知识库数据-Java代码示例
@Override
@Transactional(rollbackFor = Exception.class)
public ResponseVo importData(InputStream inputStream, String originalFilename) {
// 导入数据要分批次导入,每次导入量为1000条(防止数据量过大)
int count = 1000;
int lastIndex = count;
// 需要导入的结果集合
List
try {
List<List<Object>> dataByExcel = getDataByExcel(inputStream, originalFilename);
if (CollectionUtils.isEmpty(dataByExcel)) {
return new ResponseVo(false, '您的表中没有数据或者数据不符合校验规则,请检查!', ErrorCode.DATABASE_ERROR, null);
}
for (int i = 0; i < dataByExcel.size(); i++) {
KnowledgeBaseData data = new KnowledgeBaseData();
//类别名称
String labelName = String.valueOf(dataByExcel.get(i).get(1));
//匹配类别id
Integer integer = knowledgeBaseLabelDao.queryLabelIdByLabelNameInteger(labelName);
if (integer == null) {
//新增类别
KnowledgeBaseLabel label = new KnowledgeBaseLabel();
label.setLabelSource('系统新增');
label.setLabelName(labelName);
int id = knowledgeBaseLabelDao.insertSelective(label);
data.setLabelId(id);
} else {
data.setLabelId(integer);
}
//商品名称
data.setCommodityName(String.valueOf(dataByExcel.get(i).get(2)));
//商品编码
data.setCommodityCode(String.valueOf(dataByExcel.get(i).get(3)));
//编撰人
data.setCreateBy(String.valueOf(dataByExcel.get(i).get(4)));
//编撰时间
data.setCreateTime(new SimpleDateFormat('yyyy-MM-dd').parse(String.valueOf(dataByExcel.get(i).get(5))));
//问题
data.setKnowledgeTitle(String.valueOf(dataByExcel.get(i).get(6)));
//答案
data.setKnowledgeAnswer(String.valueOf(dataByExcel.get(i).get(7)));
//备注
data.setRemarks(String.valueOf(dataByExcel.get(i).get(8)));
// 将结果装入我们的集合中
resultList.add(data);
}
// 将resultList中的数据拆分为多个list。
List<List<KnowledgeBaseData>> groupingList = getGroupingList(resultList, count);
if (!CollectionUtils.isEmpty(groupingList)) {
for (int i = 0; i < groupingList.size(); i++) {
// 插入数据库
successCount = successCount + knowledgeBaseDataDao.insertBatch(groupingList.get(i));
}
}
return new ResponseVo(true, '本次导入数据库成功:' + successCount + ' 条', ErrorCode.SUCCESS, null);
} catch (Exception e) {
e.printStackTrace();
// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return new ResponseVo(false, '导入数据失败,请重试!', ErrorCode.DATABASE_ERROR, null);
}
}
// 错误信息解释: // 错误 "org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only" 表示事务已被标记为回滚。 // 这通常发生在事务中发生异常且事务管理器决定回滚事务时。
// 在您的代码中,代码行 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 明确地将事务标记为回滚。
// 这意味着在事务中进行的任何更改都将被回滚。
// 为了解决此问题,您应该删除代码行 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 或者以不同的方式处理异常,
// 该方式不会将事务标记为回滚。确保以适当的方式处理任何异常,并根据您的业务逻辑决定是否回滚事务。
// 此外,您还应检查日志或异常消息,以确定触发回滚的异常原因。 // 这将帮助您识别和修复导致意外回滚的根本问题。
原文地址: https://www.cveoy.top/t/topic/pmof 著作权归作者所有。请勿转载和采集!