Я не могу изменить существующий метод, поскольку он используется во многих местах приложения, и изменение его на обычную транзакцию нарушит другие варианты использования. Вот упрощенная версия кода:
Код: Выделить всё
/* Called in a service called recService */
Obj obj = objService.getByObjId(objId);
// Write operation – this is where it breaks because the getByObjId was readOnly
if (obj) {
// obj2Data is coming from argument
obj2Data.set(c + 1);
obj2Repository.save(p);
}
Код: Выделить всё
@Transactional(readOnly = true)
public Obj getByObjId(Long objId) {
Optional obj = objRepository.findById(objId);
if (obj.isPresent()) {
obj.get().setE();
obj.get().setE2();
return obj.get();
}
return null;
}
Я рассматривал возможность создания нового метода без readOnly = true, но это приводит к дублированию кода, которого я хотел бы избежать.
Я знаю, что удаление readOnly = true решит проблему, но это не вариант, поскольку это влияет на другие области.
Подробнее здесь: https://stackoverflow.com/questions/790 ... donly-true