1
resposta

[Dúvida] Estou criando um projeto pessoal e estou tendo problema na hora de alterar um dado na tabela

Estou desenvolvendo um projeto para um desafio proposto na faculdade, e está quase pronto. No entanto, estou enfrentando um problema específico ao tentar implementar uma condição dentro de um bloco 'if'. A ideia é verificar se a sessão de votação expirou e, caso tenha expirado, alterar o status da votação de 'ABERTA' para 'FECHADA' no banco de dados. O problema é que, embora a condição seja verificada e a exceção seja lançada conforme esperado, a mudança de status não ocorre no banco de dados. Curiosamente, se eu realizar a alteração do status fora do bloco 'if', ela é executada com sucesso. Estou tendo dificuldades em identificar a causa desse problema. Abaixo, compartilho o trecho de código e o link para o repositório no GitHub:

@Entity
@Table(name = "voting_sessions")
public class VotingSession {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "start_session")
    @JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss", shape = JsonFormat.Shape.STRING)
    private LocalDateTime startSession;
    @Column(name = "end_session")
    @JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss", shape = JsonFormat.Shape.STRING)
    private LocalDateTime endSession;

    @ManyToOne
    @JoinColumn(name = "id_topic")
    private Topic topic;

    @Enumerated(EnumType.STRING)
    private StatusVotingSession status;
@Service
public class VoteServiceImp implements VoteService {

    private final VotingSessionRepository votingSessionRepository;
    private final VoteRepository voteRepository;
    private final AssociateRepository associateRepository;
    private final TopicRepository topicRepository;

    public VoteServiceImp(VotingSessionRepository votingSessionRepository, VoteRepository voteRepository, AssociateRepository associateRepository, TopicRepository topicRepository) {
        this.votingSessionRepository = votingSessionRepository;
        this.voteRepository = voteRepository;
        this.associateRepository = associateRepository;
        this.topicRepository = topicRepository;
    }

    @Transactional
    @Override
    public void vote(VoteDTO voteDTO) {
        var votingSession = votingSessionRepository.findById(voteDTO.sessionID())
                .orElseThrow(() -> new SessionNotFoundException("Session not found!"));
        var associate = associateRepository.findById(voteDTO.associateID())
                .orElseThrow(() -> new AssociateNotFoundException("Associate not found!"));
        var topic = topicRepository.findById(voteDTO.topicID())
                .orElseThrow(() -> new TopicNotFoundException("topic not found!"));

        boolean hasVoted = voteRepository
                .existsByAssociateAndTopic(associate, topic);


        if (votingSession.getEndSession().isBefore(LocalDateTime.now())) {
            //Não está alterando o Status no banco
            votingSession.setStatus(StatusVotingSession.CLOSED);
            votingSessionRepository.save(votingSession);
            throw new SessionExpiredException("Session expired!");
        } else if (hasVoted) {
            throw new AssociateHasAlreadyVotedException("Associate has already voted");
        } else {
            var vote = new Vote();
            associate.setId(voteDTO.associateID());
            vote.setAssociate(associate);
            vote.setTopic(votingSession.getTopic());
            vote.setVotingSession(votingSession);
            vote.setTypeVote(voteDTO.typeVote());
            voteRepository.save(vote);
        }

    }
1 resposta

Parece que você está enfrentando um problema com a implementação de uma condição dentro de um bloco if em Java. Vou tentar ajudar!

Primeiro, vamos entender o que está acontecendo. Você mencionou que a condição é verificada e a exceção é lançada conforme esperado, mas a mudança de status não ocorre no banco de dados quando está dentro do bloco if. Isso é intrigante!

Vamos analisar o trecho de código que você compartilhou:

@Entity
@Table(name = "voting_sessions")
public class VotingSession {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "start_session")
    @JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss", shape = JsonFormat.Shape.STRING)
    private LocalDateTime startSession;
    @Column(name = "end_session")
    @JsonFormat(pattern = "dd/MM/yyyy HH:mm:ss", shape = JsonFormat.Shape.STRING)
    private LocalDateTime endSession;

    @ManyToOne
    @JoinColumn(name = "id_topic")
    private Topic topic;

    @Enumerated(EnumType.STRING)
    private StatusVotingSession status;
}

E também o serviço VoteServiceImp:

@Service
public class VoteServiceImp implements VoteService {

    private final VotingSessionRepository votingSessionRepository;
    private final VoteRepository voteRepository;
    private final AssociateRepository associateRepository;
    private final TopicRepository topicRepository;

    public VoteServiceImp(VotingSessionRepository votingSessionRepository, VoteRepository voteRepository, AssociateRepository associateRepository, TopicRepository topicRepository) {
        this.votingSessionRepository = votingSessionRepository;
        this.voteRepository = voteRepository;
        this.associateRepository = associateRepository;
        // Restante do código...
    }
}

Aparentemente, você está verificando a expiração da sessão de votação e lançando uma exceção dentro do bloco if. No entanto, a mudança de status não está sendo refletida no banco de dados.

Aqui estão algumas sugestões para investigar o problema:

  1. Verifique a Transação e o Commit: Certifique-se de que a operação de mudança de status está dentro de uma transação e que você está realizando o commit após a alteração. Se a transação não for confirmada, as mudanças não serão persistidas no banco de dados.

  2. Verifique o Fluxo de Execução: Verifique se o fluxo de execução realmente entra no bloco if quando a sessão de votação expira. Coloque logs ou mensagens de depuração para acompanhar o fluxo e verificar se a condição está sendo avaliada corretamente.

  3. Verifique a Lógica da Exceção: A exceção lançada dentro do bloco if pode estar afetando o fluxo de execução. Verifique se a exceção não está interrompendo o processamento antes que a mudança de status seja executada.

  4. Verifique o Repositório: Verifique se o método que atualiza o status está corretamente implementado no VotingSessionRepository. Certifique-se de que ele está atualizando o objeto VotingSession corretamente.

  5. Teste Fora do Bloco if: Como você mencionou que a alteração de status funciona fora do bloco if, teste novamente essa alteração fora do bloco para confirmar se ela realmente funciona corretamente.

Lembre-se de que o uso adequado de transações, exceções e fluxo de execução é crucial para garantir que as mudanças sejam refletidas no banco de dados. Espero que essas dicas ajudem a identificar a causa do problema!

Se precisar de mais assistência, fique à vontade para compartilhar mais detalhes.