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

ERROR 13728- Failed to initialize JPA EntityManagerFactory - Resolvido

Ao subir a aplicação após a inclusão das classes de consulta ocorre o erro abaixo. Observação: a migração ocorreu normal, a tabela foi criada no banco. ... 2023-07-13T15:42:19.698-03:00 ERROR 13728 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Entity 'med.voll.api.domain.consulta.Consulta' has no identifier (every '@Entity' class must declare or inherit at least one '@Id' or '@EmbeddedId' property) 2023-07-13T15:42:19.703-03:00 ERROR 13728 --- [ restartedMain] o.s.b.web.embedded.tomcat.TomcatStarter : Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'securityFilter': Unsatisfied dependency expressed through field 'repository': Error creating bean with name 'usuarioRepository' defined in med.voll.api.domain.usuario.UsuarioRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaSharedEM_entityManagerFactory' while setting bean property 'entityManager' ...

4 respostas

Olá! Tudo bem? O erro aconteceu provavelmente porque a sua classe Consulta não tem nenhum atributo marcado como @Id, sem um atributo com essa anotação o Spring Data não consegue identificar qual é a coluna que representa o Id da tabela e não consegue criar a sua estrutura com os repositories e a integração com seu banco de dados. A sua classe Consulta deve ser mais ou menos assim:


@Table(name = "consultas")
@Entity(name = "Consulta")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Consulta {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
    @JoinColumn(name = "medico_id")
    private Medico medico;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    @JoinColumn(name = "paciente_id")
    private Paciente paciente;

    private LocalDateTime data;

    @Column(name = "motivo_cancelamento")
    @Enumerated(EnumType.STRING)
    private MotivoCancelamento motivoCancelamento;

    public void cancelar(MotivoCancelamento motivo) {
        this.motivoCancelamento = motivo;
    }
}

Verifique se no seu código tem essa parte em específico:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

Lembrando que o @Id deve ser importado de jakarta.persistance. Espero ter ajudado!

O erro continua, abaixo os trechos de código e a tabela.

Consulta.java:


@Table(name = "consultas")
@Entity(name = "Consulta")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Consulta {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

Tabela consultas:

mysql> desc consultas;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | bigint   | NO   | PRI | NULL    | auto_increment |
| medico_id   | bigint   | NO   | MUL | NULL    |                |
| paciente_id | bigint   | NO   | MUL | NULL    |                |
| data        | datetime | NO   |     | NULL    |                |
+-------------+----------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
solução!

Se o atributo id já está anotado com @Id e a mensagem de erro diz que a classe Consulta não está anotada com @Id a única opção que consigo imaginar é que o Id está sendo importado do lugar errado, veja na parte dos imports da sua classe Consulta se tem um import assim:

import org.springframework.data.annotation.Id;

O correto seria:

import jakarta.persistence.Id;
// Ou
import jakarta.persistence.*;

Se no seu código tiver o import de jakarta.persistence.* e ao mesmo tempo o import org.springframework.data.annotation.Id, a prioridade vai ser o do springframework e seu código não vai funcionar. A diferença entre os dois é que o da jakarta.persistence é mais genérico e baseado na API de persistência nativa do java, e o do springframework.data é de uso exclusivo do Spring e só funciona com algumas configurações específicas que não batem com a configuração do projeto do curso. Se o problema ainda não for resolvido, tenta subir seu projeto para o GitHub e depois mandar o link aqui para a gente poder ver o código do projeto inteiro ou então só mandar o código da classe Consulta completo, a mensagem de erro completa e também como está a configuração no seu application.properties.

Muito obrigado Breno B Morim, era o "import" que estava errado.

Resolvido.