Spring Transaction для каждого сохраняемого элемента - PullRequest
0 голосов
/ 30 декабря 2018

Я реализую интеграцию 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 в отдельный метод?Как это влияет на производительность?

Любая помощь / руководство очень ценится.

Спасибо

...