java - 使用for循环在休眠中保存多条记录
问题描述
我正在使用休眠将实体的多个对象保存到数据库中。我希望如果一个记录中发生异常,那么它应该被捕获并且代码不应该破坏,即其他记录应该持续存在。
例如,\
在保存多条记录时,有一条记录,其大小为字段值,大于数据库列大小的大小。因此值太大而无法插入列中,在保留此记录时会引发异常。理想情况下,这个异常应该被捕获,并且它不应该限制循环中的其余记录被持久化。但在实际场景中,它会在这个错误记录之后打破代码和记录,不插入数据库即抛出异常和循环中断。下面是为实现这一目标而运行的代码片段
@Override
public void persistActivityLog(List<ActivityLog> acLogList) {
List<ActivityLog> failedActivityTasks = new ArrayList<>();
for (ActivityLog activityLog : acLogList) {
try {
Long runid = activityDAO.persistActivityLogData(activityLog);
} catch (DataException exp) {
failedTasks.add(activityLog);
}
}
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public Long persistActivityLogData(ActivityLog activityLog) throws DataAccessException {
Session session = null;
session = sessionFactory.getCurrentSession();
session.save(activityLog);
return activityLog.getActivityLogId();
}
在上面的代码中,当抛出 sql 异常时,它不会在 for 循环 catch 块内捕获,而是在尝试插入错误记录时异常中断代码。有没有办法让错误的记录被跳过,代码进入catch块,其他记录被成功持久化。早些时候,我在 persistActivityLog 方法上使用了 Transactional 注释,但后来我将其更改为应用于 persistActivityLogData 方法,这样记录就会被一个一个地插入,而不是批量插入。但即使在那之后我也得到了这个例外。
解决方案
试试这个。这可能是工作。
@Override
public void persistActivityLog(List<ActivityLog> acLogList) {
Session session = null;
session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
for (ActivityLog activityLog : acLogList) {
try {
session.save(activityLog);
} catch (NonUniqueObjectException e) {
//dont do anything here
}
}
tx.commit();
}
推荐阅读
- json - 反序列化具有双引号字符串的 Json 对象
- php - 如何通过 PHP IMAP 从 Gmail 服务器读取电子邮件
- azure - 每 15 天的 Azure CRON 表达式
- javascript - 角度 4 和 6 之间的差异
- nginx - Nexus3 + Nginx 反向代理
- java - Scala 12.x 和 Java 11 `String.lines`,如何在链式调用中强制进行隐式转换?
- swift - 如何在 Swift 中为 Radio Live Streaming 服务实现 HLS
- python - Django注册进度条
- maven - 是否可以在 CLI 中添加 MVN 选项?
- r-lavaan - 使用多个 DV 在 lavaan 中进行调解