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)
13
respostas

Erro Teste Conta

Erro inesperado ao executar a classe TesteConta (O arquivo persistence.xml está no diretório correto, dentro da META-INF, dentro da pasta src):

Console:

jun 26, 2018 11:48:29 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: financas
    ...]
jun 26, 2018 11:48:29 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.3.1.Final}
jun 26, 2018 11:48:29 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
jun 26, 2018 11:48:29 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.3.Final}
jun 26, 2018 11:48:29 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named financas
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at br.com.caelum.financas.teste.TesteConta.main(TesteConta.java:20)

Classe Conta:

package br.com.caelum.financas.modelo;

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

@Entity
public class Conta {

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

    private String titular;

    private String banco;

    private String agencia;

    private String numero;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitular() {
        return titular;
    }

    public void setTitular(String titular) {
        this.titular = titular;
    }

    public String getBanco() {
        return banco;
    }

    public void setBanco(String banco) {
        this.banco = banco;
    }

    public String getAgencia() {
        return agencia;
    }

    public void setAgencia(String agencia) {
        this.agencia = agencia;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

}

Classe TesteConta:

package br.com.caelum.financas.teste;

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

import br.com.caelum.financas.modelo.Conta;

public class TesteConta {

    public static void main(String[] args) {

        Conta c = new Conta();

        c.setTitular("Leonardo");
        c.setBanco("Caixa Economica");
        c.setAgencia("123");
        c.setNumero("456");

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("financas");

        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();
        em.persist(c);
        em.getTransaction().commit();

        em.close();
        emf.close();
    }

}

persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

    <!-- unidade de persistencia com o nome financas -->
    <persistence-unit name="financas">

        <!-- Implementação do JPA, no nosso caso Hibernate -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <!-- Aqui são listadas todas as entidades -->
        <class>br.com.caelum.financas.modelo.Conta</class>

        <properties>    
            <!-- Propriedades JDBC -->
            <property name="javax.persistence.jdbc.driver" 
                value="com.mysql.cj.jdbc.Driver" />

            <property name="javax.persistence.jdbc.url" 
                value="jdbc:mysql://localhost/financas?useSSL=false&amp;useTimezone=true&amp;serverTimezone=UTC" />

            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />

            <!-- Configurações específicas do Hibernate -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />

            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>
13 respostas

Oi Felipe,

O problema acontece por conta do provider declarado no persistence.xml:

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

Talvez pela versão do Hibernate do seu projeto você precise alterar para:

<provider>org.hibernate.ejb.HibernatePersistence</provider>

Veja se funciona.

Não funcionou :(, apareceu menos linhas no console:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named financas
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at br.com.caelum.financas.teste.TesteConta.main(TesteConta.java:20)

Oi Felipe,

Pode voltar então para o provider anterior.

Bom, geralmente então esse problema pode ter 2 motivos:

  1. O arquivo persistence.xml estar no local errado.

    Confere se está dentro da pasta META-INF, sendo que essa pasta deve estar dentro do src do projeto.

  2. Algum jar do hibernate está faltando.

    Baixe novamente o hibernate: https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.3.1.Final/hibernate-release-5.3.1.Final.zip/download Após descompactar o zip, tem uma pasta chamada lib e dentro dela tem a pasta chamada required. Copie todos os 11 jars para a pasta lib do seu projeto.

Veja se resolve.

Tentei fazer o que foi dito, porém continua dando o mesmo erro :/

Segue uma foto da estrutura do projeto: https://ibb.co/dzWpH8

Faz essas duas alterações

<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/financas?useTimezone=true&amp;serverTimezone=UTC"/>

Não funcionou, Leandro :/

Felipe,

Está tudo certinho no seu projeto.

Agora somente tem um motivo para dar esse erro, que é no seu MySQL não ter o banco de dados financas.

Se o banco não existir, dará esse erro mesmo, pois o Hibernate apenas cria as tabelas/colunas, mas não o database em si.

Ou também pode ser por conta do MySQL 8, que acredito ser a verão que você esteja utilizando.

O banco existe, estou utilizando a versão 8 sim, há algum problema? Desculpe a demora pela resposta

Achei uma solução... Gostaria de saber se irá em algum momento prejudicar o curso: Criei a conexão com o PostgreSQL e deu tudo certo.

solução!

Oi Felipe,

Você pode usar o Postgresql sem problemas.

Tem alguns alunos aqui que estão utilizando o MySQL 8, que saiu recentemente, e estão tendo problemas ao fazer os exercícios de alguns cursos.

Vi que no seu projeto o Jar do MySQL é o da versão 5. Talvez funcione se você atualizar o jar para a versão mais nova: http://central.maven.org/maven2/mysql/mysql-connector-java/8.0.11/mysql-connector-java-8.0.11.jar

Por hora seguirei com o PostgreSQL, já tenho uma experiência com ele, obrigado pela ajuda!

alguem achou uma solução pra usa o mysql 8? to com o msm problema aqui