3
respostas

Erro: JPA `PersistenceException` : could not execute statement

Olá, até então deram outros erros (como o de construtor) no meu codigo que consegui resolver, mas esse não, no metodo "cadastrarConsulta", segue:

package med.voll.api.domain.medico;

import med.voll.api.domain.consulta.Consulta;
import med.voll.api.domain.endereco.DadosEndereco;
import med.voll.api.domain.paciente.DadosCadastroPaciente;
import med.voll.api.domain.paciente.Paciente;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.ActiveProfiles;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;

import static org.assertj.core.api.Assertions.assertThat;

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ActiveProfiles("test")
class MedicoRepositoryTest {

    @Autowired
    private MedicoRepository medicoRepository;

    @Autowired
    private TestEntityManager em;


    @Test
    @DisplayName("Deveria retornar null quando unico médico não está disponivel na data")
    void escolherMedicoAleatorioLivreC1() {

        var proximaTercaAs10 = LocalDate.now()
                .with(TemporalAdjusters.next(DayOfWeek.TUESDAY))
                .atTime(10, 0);
        var medico = cadastrarMedico("Med1", "med1@voll.med", "123456", Especialidade.ORTOPEDIA);
        var paciente = cadastrarPaciente("Pac1", "pac1@gmail.com", "000010010000");

        cadastrarConsulta(medico, paciente, proximaTercaAs10);


        var medicoLivre = medicoRepository.escolherMedicoAleatorioLivre(Especialidade.ORTOPEDIA, proximaTercaAs10);
        assertThat(medicoLivre).isEqualTo(medico);
    }

    private void cadastrarConsulta(Medico medico, Paciente paciente, LocalDateTime data) {
        em.persist(new Consulta(medico, paciente, data));
    }

    private Medico cadastrarMedico(String nome, String email, String crm, Especialidade especialidade) {
        var medico = new Medico(dadosMedico(nome, email, crm, especialidade));
        em.persist(medico);
        return medico;
    }

    private Paciente cadastrarPaciente(String nome, String email, String cpf) {
        var paciente = new Paciente(dadosPaciente(nome, email, cpf));
        em.persist(paciente);
        return paciente;
    }

    private DadosCadastroMed dadosMedico(String nome, String email, String crm, Especialidade especialidade) {
        return new DadosCadastroMed(
                nome,
                email,
                "61999999999",
                crm,
                especialidade,
                dadosEndereco()
        );
    }

    private DadosCadastroPaciente dadosPaciente(String nome, String email, String cpf) {
        return new DadosCadastroPaciente(
                nome,
                email,
                "61999999999",
                cpf,
                dadosEndereco()
        );
    }

    private DadosEndereco dadosEndereco() {
        return new DadosEndereco(
                "rua xpto",
                "bairro",
                "00000000",
                "Brasilia",
                "DF",
                null,
                null
        );
    }

}

![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

*tentei colocar o codigo, mas deu mais de 12k caracteres hehe

3 respostas

Bom dia Felipe,

Dá uma olhada no retorno desse trecho de código:

var proximaTercaAs10 = LocalDate.now()
                .with(TemporalAdjusters.next(DayOfWeek.TUESDAY))
                .atTime(10, 0);

Pela stackTrace que você colocou a data está sendo passada como um valor nulo em algum ponto do seu teste e existe uma constraint NotNull para esse campo provavelmente.

Opa Danilo, você pode ser um pouco mais especifico? Já tentei modificar, procurei externamente como arruma, mas não faço idea

Olá Felipe, é como o colega ali falou, o problema é que o parâmetro "data" está recebendo um valor nulo. Se você está eviando uma requisição em Json pra API, pode ser que tu tenha esquecido de colocar o campo "data" no corpo da requisição. O erro ocorre porque existe uma validação que está verificando as regras do campos, uma das regras é que a coluna 'data' não pode ser null

 private void cadastrarConsulta(Medico medico, Paciente paciente, LocalDateTime data) {
        em.persist(new Consulta(medico, paciente, data));
    }