Вот структура моего кода:
ValidateCodeService:
Код: Выделить всё
public void callingMethod(){
///some logic
if (codeReceivedFromUser != codeStoredInDB){
codeDTO.setNoOfRetries (codeDTO.getNoOfRetries() -1 );
codeRepository.update(codeDTO);
throw new RuntimeException(CodeError.CDE1);
}
}
Код: Выделить всё
public class CodeRepository extends SuperRepository {
@Transactional
public codeDTO update (codeDTO dto){
///some logic
super.merge(TransformDTOToEntity(dto));
return dto;
}
}
Код: Выделить всё
public class SuperRepository{
public void merge(T entity){
getEm.merge(entity);
getEm.flush();
}
}
спящий режим flash
[мой запрос на обновление]
ошибка журнала
[мой CodeError.CDE1]
Хотелось бы отметить, что я также вызываю CodeRepository.update из другого нетранзакционного метода, который не вызывает ошибок, и обновление фиксируется, как ожидалось.
Журнал для этот вызов выглядит так
hibernatelush
[мой запрос на обновление]
hibernate commit
JDBC-фиксация
Вопрос:
Почему транзакция не фиксируется после создания RuntimeException в вызывающем методе, хотя она успешно фиксируется в других случаях? Как я могу гарантировать, что мое обновление будет зафиксировано до того, как будет создано исключение?
Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-the-tr