Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Comigo só funcionou com o construtor vazio na classe Endereco.

O meu funcionou perfeitamente mas, tive que apelar pela inclusão do construtor public Endereco(){} da classe Endereco.
Sem ele o JPA não consegue salvar registro(s) na tabela medicos.

Segue o meu Git: github.com/Adelmo2/med.voll.api.

Segue o erro sem o construtor vazio da classe Endereco

2026-01-10T18:37:45.413-03:00 ERROR 37624 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: Unable to locate constructor for embeddable 'med.voll.api.endereco.Endereco'] with root cause

org.hibernate.InstantiationException: Unable to locate constructor for embeddable 'med.voll.api.endereco.Endereco'
at org.hibernate.metamodel.internal.EmbeddableInstantiatorPojoStandard.instantiate(EmbeddableInstantiatorPojoStandard.java:51) ~[hibernate-core-7.2.0.Final.jar:7.2.0.Final]
at org.hibernate.type.ComponentType.deepCopy(ComponentType.java:511) ~[hibernate-core-7.2.0.Final.jar:7.2.0.Final]
at org.hibernate.type.TypeHelper.deepCopy(TypeHelper.java:50) ~[hibernate-core-7.2.0.Final.jar:7.2.0.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.cloneAndSubstituteValues(AbstractSaveEventListener.java:344) ~[hibernate-core-7.2.0.Final.jar:7.2.0.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:286) ~[hibernate-core-7.2.0.Final.jar:7.2.0.Final]
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:215) ~[hibernate-core-7.2.0.Final.jar:7.2.0.Final]

1 resposta
solução!

Boa tarde

No caso do Endereco, ele está sendo usado como @Embeddable. Para esse tipo de classe, o JPA precisa obrigatoriamente de um construtor sem argumentos, com pelo menos visibilidade protected (ou public), para conseguir instanciar o objeto via reflexão.

O que acontece por baixo dos panos é o seguinte:
quando o Hibernate vai persistir ou hidratar a entidade Medico, ele precisa criar uma instância de Endereco sem saber ainda quais valores vão ser atribuídos. Ele não chama seu construtor “com parâmetros”, ele cria o objeto vazio e depois popula os campos diretamente. Se não existir um construtor padrão, ele simplesmente não tem como instanciar a classe, e o erro que você recebeu é exatamente isso:

Unable to locate constructor for embeddable

Ou seja, não é que o JPA “não consiga salvar na tabela médicos”; ele falha antes, no momento de instanciar o Endereco.

O padrão recomendado é algo assim:

@Embeddable
public class Endereco {

    protected Endereco() {
        // exigido pelo JPA
    }

    public Endereco(String logradouro, String bairro, String cep, String cidade, String uf, String complemento, String numero) {
        this.logradouro = logradouro;
        this.bairro = bairro;
        this.cep = cep;
        this.cidade = cidade;
        this.uf = uf;
        this.complemento = complemento;
        this.numero = numero;
    }
}

Repare que o construtor vazio não precisa ser public; protected já atende o JPA e ainda mantém o encapsulamento da classe.

Muita gente estranha isso porque em exemplos mais simples o construtor padrão nem aparece explicitamente, mas nesses casos ele existe implicitamente. No momento em que você cria qualquer construtor com parâmetros, o Java deixa de gerar o construtor vazio automaticamente — e aí o problema surge.

Então sua solução está correta, alinhada com a especificação do JPA e com o funcionamento do Hibernate.