1
resposta

Uso de @Transactional em um método

Olá, Estou fazendo o curso do API Rest e foi utilizado o @Transactional para atualizar sem precisar usar o save do repositório. Fiz Algumas tentativas porém obtive êxito. Não sei se método de busca do recurso tem efeito sobre isso também. Usei o Transactional do javax também, e não obtive exito. Para funcionar usei o save, mas queria entender como usar ele em um método.

Estou usando spring boot 2.6.3

import org.springframework.transaction.annotation.Transactional;

 @PutMapping("/{id}")
    @Transactional
    TopicResponseDTO update(@PathVariable Long id, @RequestBody @Valid UpdateTopicRequestDTO updateTopicRequestDTO) {
    Optional<Topic> optionalTopic = this.topicRepository.findById(id);

    if (optionalTopic.isEmpty()) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Tópico com id informado não existe!");
    }

    Topic topic = optionalTopic.get();
    topic.setTitle(updateTopicRequestDTO.getTitle());
    topic.setMessage(updateTopicRequestDTO.getMessage());

    return TopicResponseDTO.convertToTopicResponseDTO(topic);
    }
1 resposta

Oi Rodrigo,

Quando se carrega uma entidade JPA pelo id ela automaticamente estará no estado Managed, sendo assim qualquer alteração em algum de seus atributos será detectado pela JPA e um update automaticamente será disparado no banco de dados, sem a necessidade de chamar o método save. Mas para isso funcionar, é necessário que uma transação esteja ativa e por isso a necessidade de anotar o método com @Transactional, pois sem a transação o update não será realizado.