Я реализую интеграцию Excel с моим приложением.Прямо сейчас код выглядит следующим образом:
@Autowired
private FooRepository fooRepository;
@Autowired
private AuxRepository auxRepository;
public void doImport(...) {
List<ExcelDto> excelRows = // read the excel file to get all the rows
for (ExcelDto row in excelRows) {
try {
// Build the Foo object to persist
Foo foo = new Foo();
foo.setProp1(row.prop1);
// This is just to show that I access the database in order
// to retrieve information needed by the Foo object
String aux = auxRepository.findOneById(row.auxId);
foo.setAux(aux);
//Build the rest of Foo...
// Try to save it (it still may fail due to database constraints)
fooRepository.save(foo);
} catch (Exception e) {
// log error
}
}
}
Интеграция в Excel имеет следующий реквизит:
- Если элемент не может быть сохранен, ошибка должна быть зарегистрирована, но следующие элементы должны бытьpersisted
В настоящий момент происходит следующее: в случае сбоя какого-либо элемента транзакция откатывается, и по некоторым причинам сохраненные элементы остаются в сохранении, но на следующем .save()
я начинаю получать ошибкиtransaction rolled back
.Я нигде не использую аннотации @Transactional
, но я использую spring-boot
и spring-data
, поэтому транзакции включены по умолчанию (как сказано здесь ).
Так как я 'Я не имел опыта со Spring, мне интересно, как лучше всего достичь этого требования.Должен ли я поместить метод .save()
с другим методом с Transaction.REQUIRES_NEW
, например:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public save(Foo foo) {
fooRepository.save(foo);
}
Если так, что произойдет, если мой auxRepository.findOneById()
не удастся выполнить с другим методом?Должен ли я поместить всю логику построения и сохранения foo
в отдельный метод?Как это влияет на производительность?
Любая помощь / руководство очень ценится.
Спасибо