Мне нужно сохранить список объектов в БД в виде пакетной вставки, но я не хочу, чтобы весь пакет откатывался, если один или несколько объектов терпят неудачу; т. е. любые записи, которые были успешно сохранены, должны оставаться в БД.
Кроме того, мне нужно определить идентификаторы объектов, которые не удалось сохранить, и вернуть этот список вызывающей стороне.
Ниже приведена простая демонстрация того, что мне нужно сделать; показан класс объекта (список которого мне нужно сохранить) и фрагмент метода DAO:
class Student {
int code;
String name;
...
}
public List<Integer> bulkAddStudents(List<Student> students) {
String query = "INSERT INTO STUDENT (CODE, NAME) VALUES (:code, :name)";
List<Integer> failedCodes = new LinkedList<Integer>(); // to store failed student-codes
List<Map<String, Object>> params = new ArrayList<>();
try {
students.forEach(student -> {
Map<String, Object> stu = new HashMap<>();
stu.put("code", student.getCode());
stu.put("name", student.getName());
params.add(stu);
});
namedJdbcTemplate.batchUpdate(query, params.toArray(new HashMap[0]));
// TODO prevent transactional rollback for failed records
// TODO get student numbers of failed records; add to "failedCodes"
} catch (Exception ex) {
throw new DAOException(ex);
}
return failedCodes; // return IDs of failed records
}
Это может не соответствовать общему варианту использования, но кто-нибудь знает, как сделать именно то, что указано выше? Заранее спасибо.