На мой взгляд, есть несколько проблем с вашим кодом:
Вы перезаписываете метод saveOrUpdate()
без необходимости в этом. Простого вызова super () должно было быть достаточно, чтобы заставить @Async
работать.
Я предполагаю, что вы где-то (в вашем классе контроллера?) Объявляете транзакционный контекст. Это обычно относится к текущему потоку. Используя @Async, вы можете оставить этот контекст транзакции, поскольку (из-за асинхронного выполнения DAO) основной поток может быть уже завершен при вызове saveOrUpdate()
. И хотя я в настоящее время точно не знаю, есть хорошее изменение, что объявленная транзакция действительна только для текущего потока.
Одно возможное исправление: создайте дополнительный компонент, например AsyncGaugeCategoryService
или около того:
@Component
public class AsyncGaugeCategoryService {
private final GaugeCategoryDao gaugeCategoryDao;
@Autowired
public AsyncGaugeCategoryService(GaugeCategoryDao gaugeCategoryDao) {
this.gaugeCategoryDao = gaugeCategoryDao;
}
@Async
@Transactional
public void saveOrUpdate(GaugeCategory gaugeCategory) {
gaugeCategoryDao.saveOrUpdate(gaugeCategory);
}
}
Затем внедрите службу вместо DAO в ваш класс контроллера. Таким образом, вам не нужно перезаписывать какие-либо методы, и вы должны иметь действительный транзакционный контекст в вашем асинхронном потоке.
Но имейте в виду, что ваш поток выполнения не даст вам никаких подсказок, если что-то пойдет не так во время хранения в базе данных. Вам нужно будет проверить файлы журнала, чтобы обнаружить любые проблемы.