Spring - Вопрос о @Transactional для сервисов, использующих репозитории (контекст JPA) - PullRequest
0 голосов
/ 26 февраля 2020

Вообще говоря, хорошей практикой является аннотирование с помощью бизнес-методов @Transactional аннотированных классов @Service. Таким образом, конечно, весь метод будет выполняться как единица работы атома c. Насколько я знаю, другой хорошей практикой является использование репозиториев для извлечения и сохранения сущностей, без аннотирования репозиториев с помощью @ Transactional.

Метод save() в репозитории также является хорошим местом для размещения логов аудита c, например. Теперь давайте создадим следующий сценарий:

@Transactional
public void executeSomeTask() {
   List<MyEntity> lst = someRepo.loadEntities();
   List<SecondEntity> lst2 = anotherRepo.loadEntities();
   // work on lst and lst2, changing some properties
   someReport.saveList(lst);
   anotherRepo.saveList(lst2);
}

С кодом, показанным выше, вызов метода saveList() в обоих репозиториях не нужен, потому что он аннотирован @Transactional executeSomeTask(), если вызов метода заканчивается без исключений, все изменения на объектах будут автоматически сохраняться. Если забыть вызвать репозитории, все логи аудита c будут пропущены. Какова лучшая практика в этих случаях? В двух словах, я хотел бы применить вызов методов сохранения в хранилище для фактического сохранения данных.

...