Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
12
respostas

Uma exceção é lançada falando que não tem nenhum provedor de persistência para EntityManager chamado loja

Estou tentando resolver esse problema já faz um tempão, procurei em outros foruns e nada. Se vocês poderem me ajudar agraceria muito!

Exceção lançada;

INFO: HHH000318: Could not find any META-INF/persistence.xml file in the classpath
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named loja
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at br.com.byteshop.testes.CadastroDeProduto.main(CadastroDeProduto.java:19)

classe Produto;

package br.com.byteshop.modelo;

import java.math.BigDecimal;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "produtos")
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String descricao;
    private BigDecimal preco;

    //Getters  e Setters...

}

Classe CadastroDeProduto;

package br.com.byteshop.testes;

import java.math.BigDecimal;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import br.com.byteshop.modelo.Produto;

public class CadastroDeProduto {

    public static void main(String[] args) {
        Produto celular = new Produto();
        celular.setNome("Samsung M30");
        celular.setDescricao("Muito bom.");
        celular.setPreco(new BigDecimal("800"));

        EntityManagerFactory factory = Persistence.createEntityManagerFactory("loja");
        EntityManager entityManager = factory.createEntityManager();
        entityManager.persist(celular);
    }

}

Meu persistence.xml;

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">

    <persistence-unit name="loja"
        transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>br.com.byteshop.modelo.Produto</class>

        <properties>
            <property name="javax.persistence.jdbc.driver"
                value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost:3306/loja" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password"
                value="9GOxcnz88I" />

            <property name="hibernate.dialect"
                value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>

    </persistence-unit>

</persistence>

A estrutura das pastas;

estrutura das pastas

As libs presentes no Maven Dependencies;

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

Tabela do banco de dados MySQL (criei a tabela antes de qualquer execução Java):

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

Espero ter passado o maximo de informações possiveis.

12 respostas

Oi Fábio,

Parece que a JPA não está encontrando seu arquivo persistence.xml, embora ele esteja criado corretamente na pasta META-INF do projeto.

Talvez no seu projeto o Eclipse não tenha configurado a pasta src/main/resources como sendo uma source folder e por isso o arquivo não é encontrado.

Você pode verificar isso clicando com o botão direito no projeto e indo em: Buid Path -> Configure Build Path... e verificando na aba superior Source.

Olá Rodrigo, tudo bem?

Me desculpe pela demora, não tive tempo ontem. Mas voltando ao assunto, o source folder está configurado corretamente, não sei oque fazer mais, já tentei de tudo.

Print do soucer folder:

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

Oi Fábio,

Você tem como disponibilizar seu projeto para avaliarmos o que pode ser o problema?

Uma última verificação: veja no menu superior do Eclipse Project se a opção Build Automatically está marcada.

Bom dia professor.

A opção Build Automatically está marcada sim.

Aqui está o projeto.

Obs: Eu testei com o banco de dados em memória que você utilizou nas aulas e funcionou normalmente.

Oi Fábio,

Eu baixei o seu projeto e aqui funcionou fazendo as seguintes alterações no persistence.xml:

  1. O driver do MySQL tava com a classe antiga
  2. Tava duplicada a propriedade hibernate.hbm2ddl.auto
  3. A propriedade do dialeto do hibernate do MySQL estava incorreta.

Alterando ficou assim:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">

    <persistence-unit name="loja" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>br.com.byteshop.modelo.Produto</class>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/loja" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="9GOxcnz88I" />

            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>

Boa tarde professor.

Eu tentei aqui e também não foi, eu não sei o que está acontecendo para o meu não funcionar. Será que se eu desinstalar completamento o MySQL deve resolver esse problema? Por que eu não sei mais o que pode resolver esse problema.

Pode ser algo com o Eclipse e/ou workspace.

Tenta crair outro workspace e importar o projeto nele para ver se resolve.

Continua dando o mesmo problema, mesmo em outras IDEAS, como a intellij por exemplo.

Ah outra coisa,

posta aqui a exception completa que aparece no console.

Aqui está a exception completa:

out. 28, 2021 5:08:54 PM org.hibernate.jpa.boot.internal.PersistenceXmlParser doResolve
INFO: HHH000318: Could not find any META-INF/persistence.xml file in the classpath
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named loja
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at br.com.byteshop.testes.CadastroDeProduto.main(CadastroDeProduto.java:19)

Pois é Fábio,

Não consegui descobrir o que pode ser o problema aí no seu caso.

Um último chute meu seria que você está utilizando o Java 17, e talvez tenha alguma imcompatibilidade. Eu testei aqui com o Java 11 no meu computador e funcionou certinho.

solução!

Acabei de tentar aqui e realmente não foi, mas tudo bem, vou usar o banco de dados em memoria como você nas aulas.

Muito obrigado, você realmente tentou me ajudar.