我正在使用休眠将一个实体的多个对象保存到数据库中。 我希望如果一条记录中发生异常,则应将其捕获并且代码不应中断,即其他记录应保留。
例如,\
保存多条记录时,有一条记录的大小为字段值的一个,大于数据库列大小的大小。因此值太大而无法插入到列中,则在保留此记录时会引发异常。理想情况下,应该捕获此异常,并且该异常不应限制循环中的其余记录被持久化。但是在实际情况下,它会在错误记录后中断代码并记录,请勿插入数据库中,即引发异常并中断循环。以下是可实现此目标的代码段
@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块,并成功保留其他记录。 EArlier我在persistActivActivLog方法上使用了Transactional批注,但后来我更改了此注释,以将其应用于persistActivityLogData方法,以便记录被一个接一个地插入,而不是成批插入。但是即使在那之后,我仍然会遇到这个异常。
答案 0 :(得分:0)
尝试这个。可能有用。
@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();
}