У меня странная проблема с @Transactional, дело в том, что она не выполняет полный откат ошибки, и я не понимаю, почему.
Это мой сервис:
@Transactional
public class AService {
@Autowired
private AuditRepository auditRepository;
@Autowired
private RequestStatusRepository requestStatusRepository;
@Autowired
private ApprovementRepository approvementRepository;
public void approve(long approvementId) {
updateStatus();
}
private void updateStatus(long approvementId){
Approvement approvement = approvementRepository.findById(approvementId);
updateApprovement(approvement);
Request request = requestRepository.findById(approvement.getRequest().getId());
updateRequest(request);
}
private void updateApprovement(){
approvementRepository.save(approvement);
}
private void updateRequest(Request request){
requestRepository.save(request);
auditRepository.save(new Audit(request));
}
}
Это репозиторий утверждений, все они похожи:
@Repository
public class ApprovementRepositoryImpl implements ApprovementRepository {
@Autowired
private JpaApprovementRepository jpaApprovementRepository;
private Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
@Override
public Approvement findById(long id) {
return jpaApprovementRepository.findById(id).map(this::to).orElse(null);
}
@Override
public void save(Approvement approvement) {
jpaApprovementRepository.save(from(approvement));
}
public Approvement to(ApprovementEntity from){
return mapper.map(from, Approvement.class);
}
public ApprovementEntity from(Approvement to){
return mapper.map(from, ApprovementEntity.class);
}
}
Хорошо, полученный запрос очень длинное поле и audRepository не может его сохранить, изменение в аудите никогда не происходило, и изменение в запросе откатывается, но изменение подтверждения утверждается.
Почему это происходит ? Я пробовал разные типы размножения и безуспешно перемещал аннотацию @Transactional из класса в метод publi c, любые идеи были бы хорошими, спасибо.