Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

[Dúvida] Não consigo salvar no banco de dados!

Olá pessoal! Boa noite! Estou recomeçando o projeto voll.med, e, estou travado na parte de persistência de dados. Ao tentar salvar o primeiro registro no banco de dados na tabela de medicos, estou tomando o seguinte erro que aparece no VSCode:

"timestamp": "2024-12-23T22:47:12.224+00:00", "status": 500, "error": "Internal Server Error", "trace": "org.springframework.orm.jpa.JpaSystemException: Unable to locate       constructor for embeddable 'br.com.alura.da.med.voll.clinica.api.api_restFUL       .endereco.Endereco'\r\n\tat org.springframework.orm.jpa.vendor       .HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java       :341)\r\n\tat org.springframework.orm.jpa.vendor.HibernateJpaDialect       .translateExceptionIfPossible(HibernateJpaDialect.java:241)\r\n\tat org       .springframework.orm.jpa.AbstractEntityManagerFactoryBean       .translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:560       )\r\n\tat org.springframework.dao.support       .ChainedPersistenceExceptionTranslator.translateExceptionIfPossible       (ChainedPersistenceExceptionTranslator.java:61)\r\n\tat org.springframework       .dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:343       )\r\n\tat org.springframework.dao.support       .PersistenceExceptionTranslationInterceptor.invoke       (PersistenceExceptionTranslationInterceptor.java:160)\r\n\tat org       .springframework.aop.framework.ReflectiveMethodInvocation.proceed       (ReflectiveMethodInvocation.java:184)\r\n\tat org.springframework.data.jpa       .repository.support       .CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor       .invoke(CrudMethodMetadataPostProcessor.java:165)\r\n\tat org.springframework       .aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation       .java:184)\r\n\tat org.springframework.aop.framework.JdkDynamicAopProxy.invoke       (JdkDynamicAopProxy.java:223)\r\n\tat jdk.proxy4/jdk.proxy4.$Proxy126.save       (Unknown Source)\r\n\tat br.com.alura.da.med.voll.clinica.api.api_restFUL       .controllers.MedicoController.cadastrarMedico(MedicoController.java:24

Grato por ajuda.

8 respostas

Olá, Fagner!

Pelo erro que você mencionou, parece que o problema está relacionado à classe Endereco que você está tentando usar como uma embeddable em sua entidade Medico. O erro "Unable to locate constructor for embeddable" indica que o Hibernate não conseguiu encontrar um construtor padrão (sem argumentos) na classe Endereco.

Aqui estão algumas dicas que podem ajudar a resolver o problema:

  1. Verifique o Construtor Padrão: Certifique-se de que a classe Endereco possui um construtor público sem argumentos. O Hibernate precisa disso para criar instâncias da classe.

    @Embeddable
    public class Endereco {
        // Campos...
    
        public Endereco() {
            // Construtor padrão
        }
    
        // Outros construtores, getters e setters...
    }
    
  2. Anotações Correta: Verifique se a classe Endereco está anotada corretamente com @Embeddable. Isso é necessário para que o Hibernate saiba que essa classe deve ser incorporada em outra entidade.

  3. Dependências e Configuração: Certifique-se de que todas as dependências do Hibernate e Spring Data JPA estão configuradas corretamente no seu pom.xml.

  4. Verifique o Mapeamento: Na entidade Medico, verifique se o campo Endereco está mapeado corretamente com a anotação @Embedded.

    @Entity
    public class Medico {
        // Outros campos...
    
        @Embedded
        private Endereco endereco;
    
        // Construtores, getters e setters...
    }
    

Depois de fazer essas verificações, tente rodar a aplicação novamente para ver se o erro persiste. Bons estudos!

bom dia Profe!

Vou mandar abaixo o código da classe "Endereco.java" e da entidade "MedicoEntity":

package br.com.alura.da.med.voll.clinica.api.api_restFUL.endereco;

import jakarta.persistence.Embeddable; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor;

@Getter @AllArgsConstructor @NoArgsConstructor @Embeddable public class Endereco { private String logradouro; private String bairro; private String cidade; private String estado; private String cep; private String pais; private String numero; private String complemento;

public Endereco(DadosDoEndereco endereco) {
    this.logradouro = endereco.logradouro();
    this.bairro = endereco.bairro();
    this.cidade = endereco.cidade();
    this.estado = endereco.estado();
    this.cep = endereco.cep();
    this.pais = endereco.pais();
    this.numero = endereco.numero();
    this.complemento = endereco.complemento();
}

}

package br.com.alura.da.med.voll.clinica.api.api_restFUL.medicos;

import br.com.alura.da.med.voll.clinica.api.api_restFUL.endereco.Endereco; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor;

@Getter @Entity(name = "MedicoEntity") @Table(name = "medicos") @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of = "id") public class MedicoEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nome; private String email; private String telefone; private String registro; private String crm; @Enumerated(EnumType.STRING) private Especialidade especialidade; private String rg; private String cpf; @Embedded private Endereco endereco;

public MedicoEntity(DadosDeCadastroDeMedicos dados) {
    this.nome = dados.nome();
    this.email = dados.email();
    this.telefone = dados.telefone();
    this.registro = dados.registro();
    this.crm = dados.crm();
    this.especialidade = dados.especialidade();
    this.rg = dados.rg();
    this.cpf = dados.cpf();
    this.endereco = new Endereco(dados.endereco());
}

}

Consegue me ajudar achar o erro?

Boa tarde pessoal!

Ainda não consegui identificar aqui no meu projeto o que está acontecendo...

O porquê não consigo salvar no banco de dados.

Oi!

Parece ser problema do Lombok para gerar o construtor.

Dá uma olhada aqui que explico como resolver: https://cursos.alura.com.br/forum/topico-bug-unable-to-locate-constructor-for-embeddable-med-vall-api-endereco-endereco-lombok-instalado-474598

Profe Rodrigo, muito obrigado sempre pela ajuda!

Deixa lhe pedir um outro favor, eu sou deficiente visual, e, não consegui saber / acompanhar o print da tela que vc colocou lá na resposta no link que me disponibilizou.

Assim, tem como você montar um passo a passo em texto mesmo pra fazer aqui?

E lhe adianto que, deve ser este problema mesmo que está acontecendo aqui. No passo a passo que me mandar, vou conseguir resolver.

solução!

Oi Fagner!

Claro! Vou descrever em texto para te ajudar:

  1. Abra a tela de configurações do IntelliJ IDEA: Utilize o atalho Ctrl + Alt + S (ou Cmd + , no macOS) para abrir a janela de configurações.

  2. Navegue até as configurações do Compiler:

    • No menu lateral esquerdo, localize e expanda a seção "Build, Execution, Deployment".
    • Expanda a seção "Compiler" dentro de "Build, Execution, Deployment".
  3. Selecione "Annotation Processors":

    • Dentro de "Compiler", clique na opção "Annotation Processors". Esta ação irá carregar a página de configurações de processadores de anotação no painel direito da janela.
  4. Configurar profiles de anotação:

    • Na seção "Annotation profile for" você deve selecionar o profile chamado "api", que está relacionado com o projeto do curso.
  5. Habilite o processamento de anotações:

    • Certifique-se de que o checkbox "Enable annotation processing" esteja marcado. Isso indica que o processamento de anotações está ativado para o seu projeto.
  6. Escolha a origem dos processadores:

    • Selecione a opção "Obtain processors from project classpath". Isso significa que o IntelliJ irá buscar os processadores de anotação a partir das dependências do seu projeto (configuradas em arquivos como pom.xml ou build.gradle).
  7. Aplicar as configurações:

    • Após realizar todas as configurações desejadas, clique em "Apply" ou "OK" para salvar as alterações e fechar a janela de configurações.

Após realizar os procedimentos, clique com o botão direito no projeto e escolha a opção Rebuild Module 'API' para que o IntelliJ recompile as classes do projeto e o problema do Lombok deve ser resolvido.

Se tiver algum problema ou mais dúvidas, é só perguntar.

Profe Rodrigo, você é de mais!!!!

Deu certinho aqui! Mais uma vez, muitíssimo obrigado.

Valeu pela atenção e o suporte!

Caros, parece um detalhe pequeno, mas havia colocado desse jeito:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade

e não funcionou!

Porém ao colocar a anotação justamente acima da classe, funcionou e consegui armazenar os dados.

Para funcionar, o código ficou desse jeito: (uma mudança sutil)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade