首页 > 解决方案 > 使用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 方法,这样记录就会被一个一个地插入,而不是批量插入。但即使在那之后我也得到了这个例外。

标签: javahibernate

解决方案


试试这个。这可能是工作。

    @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();

}

推荐阅读