Я перевожу одно существующее приложение из традиционной модели Spring MVC в Spring Reactive. Мой первый рефакторинг позволил мне с этим фрагментом кода:
return Mono.fromSupplier(() -> visitRequestDao.findById(requestId).get())
.map(request -> request.approve())
.map(request -> ResponseEntity.ok(listOfPendingVisitRequest(owner)));
После выполнения конечной точки я заметил, что у моей сущности не изменилось состояние. Как пользователь Hibernate, я знаю, что при загрузке какого-либо объекта любое примененное изменение будет отражено в базе данных после фиксации. Я предположил, что событие выполнялось в другом потоке. Я немного изменил код.
return Mono.fromSupplier(() -> visitRequestDao.findById(requestId).get())
.map(request -> transactionalContext.execute(() -> request.approve()))
.map(request -> ResponseEntity.ok(listOfPendingVisitRequest(owner)))
Класс TransactionalContext
создан и помечен как транзакционный. Итак, теперь я знаю, что каждый раз, когда вызывается его метод, будет запущена новая транзакция или будет использована текущая. Это правильный подход? Есть ли решение?