Erro ao invocar: javax.persistence.EntityManagerFactory.createEntityManager()

Boa tarde galera, sou novo na programação Java. Estou estudando um projeto JPA e ao executar o projeto dá o erro: Cannot invoke “javax.persistence.EntityManagerFactory.createEntityManager()” because “infra.Aula343_DAO.emf” is null

o meu persistence.xml está da seguinte forma:

<?xml version="1.0" encoding="UTF-8"?>



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

	<class>modelo.basico.Aula334_Usuario</class>
  <class>modelo.basico.Aula342_Produto</class>
  <class>modelo.umpraum.Aula347_Assento</class>
  <class>modelo.umpraum.Aula347_Cliente</class>
  <class>modelo.umpramuitos.Aula352_Pedido</class>
  <class>modelo.umpramuitos.Aula352_PedidoItem</class>
  <class>modelo.muitospramuitos.Aula353_Tio</class>
  <class>modelo.muitospramuitos.Aula353_Sobrinho</class>
  <class>modelo.muitospramuitos.Aula354_Filme</class>
  <class>modelo.muitospramuitos.Aula354_Ator</class>

	<properties>
		<!-- pacote: com.mysql.cj.jdbc === classe: Driver -->
		<property name="javax.persistence.jdbc.driver" 		value="com.mysql.jdbc.Driver"/>
		<property name="javax.persistence.jdbc.url"     	value="jdbc:mysql://localhost/curso_java"/>
		<property name="javax.persistence.jdbc.user" 			value="root"/>
		<property name="javax.persistence.jdbc.password"  value="estudo"/>

		<!-- pacote: org.hibernate.dialect === classe: MySQL57Dialect -->
		<property name="hibernate.dialect" 			value="org.hibernate.dialect.MySQL57Dialect"/>
		<property name="hibernate.show_sql" 		value="true"/>
		<property name="hibernate.format_sql" 	value="true"/>
		<property name="hibernate.hbm2ddl.auto"	value="update"/> <!-- se vai gerar um eskema de banco de dados
    a partir das tabelas, ele vai olhar o mapeamento dos objetos e criar as tabelas
    em projetos reais isso não é usado, podendo para isso o valor ser apenas NONE ou nem informar essa propriedade -->
	</properties>
</persistence-unit>

a minha classe DAO está da seguinte forma:
package infra;

import java.util.List;

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

//utilizando GENERICS ==>
public class Aula343_DAO {
/* por ser um ATRIBUTO estático STATIC, o entitymanagerfactor EMF deve ser inicializado na sua criação
* como está na linha abaixo
* private static EntityManagerFactory emf = Persistence.createEntityManagerFactory(“Secao16_JavaPersistenceAPI_Maven”);
* ou criado um bloco estático, que é chamado apenas na inicialização da classe
* como está feito nas linhas abaixo
* OBSERVAÇÃO, o bloco ESTÁTICO serve para todos os ATRIBUTOS ESTÁTICOS que a classe possa a ter
* por isso não tem nome, apenas STATITC {} */
private static EntityManagerFactory emf;
private EntityManager em;
private Class classe;

static {
	try {
		emf = Persistence.createEntityManagerFactory("Secao16_JavaPersistenceAPI");
	} catch (Exception e) {
		/* logar usando => log4j
		 * por ser uma rotina de acesso ao banco de dados, o instrutor indica a utilização do LOG4J 
		 * para criar LOGS na inicialização */
	}
}

public Aula343_DAO () {
	this(null);
}

public Aula343_DAO (Class<E> classe) {
	this.classe = classe;
	em = emf.createEntityManager();
};
//início dos métodos que retornam a própria classe
public Aula343_DAO<E> abrirTransacao(){
	em.getTransaction().begin();
	return this;
}

public Aula343_DAO<E> fecharTransacao(){
	em.getTransaction().commit();
	return this;
}

public Aula343_DAO<E> incluir(E entidade) {
	em.persist(entidade);
	return this;
}

public Aula343_DAO<E> incluirAtomico(E entidade) {
	/* ATÔMICO é quando no método havera os comandos que iniciam e fecham uma transação
	 * isso é usado quando em um método haverá mais de uma INCLUSÃO/EDIÇÃO/EXCLUSÃO e todos os EVENTOS/ACONTECIMENTOS
	 * devem estar dentro da mesma transação */
	//aqui está a forma como o instrutor fez
	return this.abrirTransacao().incluir(entidade).fecharTransacao();
	
	//aqui está como eu fiz
	//em.getTransaction().begin();
	//em.persist(entidade);
	//em.getTransaction().commit();
	//return this;
}
//fim dos métodos que retornam a própria clase
 
public E obterPorID(Object ID) {
	return em.find(classe, ID);
}

public List<E> obterTodos(){
	return this.obterTodos(0,0);
}

public List<E> obterTodos(int qtde, int deslocamento){
	if (classe == null) {
		throw new UnsupportedOperationException("Classe nula");
	}
	//jpql => java persistence query linguage
	String jpql = "select e from " + classe.getName() + " e";
	TypedQuery<E> query = em.createQuery(jpql, classe);
	//PAGINAÇÃO
	//quantos registros deseja retornar na consulta
	if (qtde > 0) {
		query.setMaxResults(qtde);
	}
	/* o deslocamento indica onde irá iniciar a consulta ou resultado da consulta
	 * ex: se indicar 10 significa que o resultado retornada do 10º registro encontrado */
	if (deslocamento > 0) {
		query.setFirstResult(deslocamento);
	}
	return query.getResultList();
}

public void fechar() {
	/* aqui estou fechando apenas o ENTITYMANAGER porque o ENTITYMANAGERFACTORY é STATICO, será criado apenas
	 * uma única vez*/
	em.close();
}	

}

a classe que chama a classe DAO através de GENERICS
package teste.muitospramuitos;

import infra.Aula343_DAO;
import modelo.muitospramuitos.Aula353_Sobrinho;
import modelo.muitospramuitos.Aula353_Tio;

public class Aula353_NovoTioSobrinho {
public static void main(String[] args) {
Aula353_Tio tia = new Aula353_Tio(“Maria”);
Aula353_Tio tio = new Aula353_Tio(“João”);
Aula353_Sobrinho sobrinho = new Aula353_Sobrinho(“Junior”);
Aula353_Sobrinho sobrinha = new Aula353_Sobrinho(“Ana”);
/* para haver uma relação BI-DIRECIONAL — MUITOS PARA MUITOS deve haver uma consistência nos dados
* por assim dizer
* por isso que se linkar um tio a um sobrinho, deve haver também a ligação entre o sobrinho e este tio */
tia.getSobrinhos().add(sobrinho);
sobrinho.getTios().add(tia);
tia.getSobrinhos().add(sobrinha);
sobrinha.getTios().add(tia);

	tio.getSobrinhos().add(sobrinho);
	sobrinho.getTios().add(tio);
	tio.getSobrinhos().add(sobrinha);
	sobrinha.getTios().add(tio);
	
	Aula343_DAO<Object> dao = new Aula343_DAO<>();
	dao.abrirTransacao().incluir(tia).incluir(tio).incluir(sobrinho).incluir(sobrinha).fecharTransacao();
	dao.fechar();
}

}

Onde é que você abriu a tag persistence-unit ?

1 curtida

Pelo que observei que aqui está faltando parte do meu arquivo PERSISTENCE.XML, minhas informações começam com:
o meu persistence.xml está da seguinte forma:
<?xml version="1.0" encoding="UTF-8"?>
— e depois continua em —
org.hibernate.jpa.HibernatePersistenceProvider
tão logo vou colocar o meu persistence de uma forma que possa ser visto por completo

Acho que parte do arquivo ficou sem formatação.

Quando postar no fórum, por favor coloque o código formatado. Basta selecioná-lo e usar o botão </> do editor:

formatarcodigoguj

1 curtida

Muito obrigado, vou me lembrar disso na próxima postagem. Essa foi a minha primeira.

Boa tarde irmãos, aqui está todo o meu arquivo persistence.xml

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="Secao16_JavaPersistenceAPI">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>modelo.basico.Aula334_Usuario</class>
<class>modelo.basico.Aula342_Produto</class>
<class>modelo.umpraum.Aula347_Assento</class>
<class>modelo.umpraum.Aula347_Cliente</class>
<class>modelo.umpramuitos.Aula352_Pedido</class>
<class>modelo.umpramuitos.Aula352_PedidoItem</class>
<class>modelo.muitospramuitos.Aula353_Tio</class>
<class>modelo.muitospramuitos.Aula353_Sobrinho</class>
<class>modelo.muitospramuitos.Aula354_Filme</class>
<class>modelo.muitospramuitos.Aula354_Ator</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/curso_java"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="estudo"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL57Dialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>

O nome da sua persistence unit é Secao16_JavaPersistenceAPI

Você está tentando carregar usando o nome Secao16_JavaPersistenceAPI_Maven

O irmão, foi do exemplo que peguei, mas no caso onde é informado _Maven está comentado, na classe Aula343_DAO, pelo que vi essa classe também ficou mal formatada. Peço desculpas é a minha primeira vez postando aqui e ao corrigir eu corrigi apenas o persistence.xml. Vou colocar os dados da classe formatado.

package infra;

import java.util.List;

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

//utilizando GENERICS ==> <E>
public class Aula343_DAO <E> {
	/* por ser um ATRIBUTO estático STATIC, o entitymanagerfactor EMF deve ser inicializado na sua criação
	 * como está na linha abaixo
	 * private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("Secao16_JavaPersistenceAPI_Maven");
	 * ou criado um bloco estático, que é chamado apenas na inicialização da classe
	 * como está feito nas linhas abaixo
	 * OBSERVAÇÃO, o bloco ESTÁTICO serve para todos os ATRIBUTOS ESTÁTICOS que a classe possa a ter
	 * por isso não tem nome, apenas STATITC {} */
	private static EntityManagerFactory emf;
	private EntityManager em;
	private Class<E> classe;
	
	static {
		try {
			emf = Persistence.createEntityManagerFactory("Secao16_JavaPersistenceAPI");
		} catch (Exception e) {
			/* logar usando => log4j
			 * por ser uma rotina de acesso ao banco de dados, o instrutor indica a utilização do LOG4J 
			 * para criar LOGS na inicialização */
		}
	}
	
	public Aula343_DAO () {
		this(null);
	}

	public Aula343_DAO (Class<E> classe) {
		this.classe = classe;
		em = emf.createEntityManager();
	};
	//início dos métodos que retornam a própria classe
	public Aula343_DAO<E> abrirTransacao(){
		em.getTransaction().begin();
		return this;
	}
	
	public Aula343_DAO<E> fecharTransacao(){
		em.getTransaction().commit();
		return this;
	}
	
	public Aula343_DAO<E> incluir(E entidade) {
		em.persist(entidade);
		return this;
	}
	
	public Aula343_DAO<E> incluirAtomico(E entidade) {
		/* ATÔMICO é quando no método havera os comandos que iniciam e fecham uma transação
		 * isso é usado quando em um método haverá mais de uma INCLUSÃO/EDIÇÃO/EXCLUSÃO e todos os EVENTOS/ACONTECIMENTOS
		 * devem estar dentro da mesma transação */
		//aqui está a forma como o instrutor fez
		return this.abrirTransacao().incluir(entidade).fecharTransacao();
		
		//aqui está como eu fiz
		//em.getTransaction().begin();
		//em.persist(entidade);
		//em.getTransaction().commit();
		//return this;
	}
	//fim dos métodos que retornam a própria clase
	 
	public E obterPorID(Object ID) {
		return em.find(classe, ID);
	}
	
	public List<E> obterTodos(){
		return this.obterTodos(0,0);
	}
	
	public List<E> obterTodos(int qtde, int deslocamento){
		if (classe == null) {
			throw new UnsupportedOperationException("Classe nula");
		}
		//jpql => java persistence query linguage
		String jpql = "select e from " + classe.getName() + " e";
		TypedQuery<E> query = em.createQuery(jpql, classe);
		//PAGINAÇÃO
		//quantos registros deseja retornar na consulta
		if (qtde > 0) {
			query.setMaxResults(qtde);
		}
		/* o deslocamento indica onde irá iniciar a consulta ou resultado da consulta
		 * ex: se indicar 10 significa que o resultado retornada do 10º registro encontrado */
		if (deslocamento > 0) {
			query.setFirstResult(deslocamento);
		}
		return query.getResultList();
	}
	
	public void fechar() {
		/* aqui estou fechando apenas o ENTITYMANAGER porque o ENTITYMANAGERFACTORY é STATICO, será criado apenas
		 * uma única vez*/
		em.close();
	}
	
}

agora a classe que chama a classe do DAO

package teste.muitospramuitos;

import infra.Aula343_DAO;
import modelo.muitospramuitos.Aula353_Sobrinho;
import modelo.muitospramuitos.Aula353_Tio;

public class Aula353_NovoTioSobrinho {
	public static void main(String[] args) {
		Aula353_Tio tia = new Aula353_Tio("Maria");
		Aula353_Tio tio = new Aula353_Tio("João");
		Aula353_Sobrinho sobrinho = new Aula353_Sobrinho("Junior");
		Aula353_Sobrinho sobrinha = new Aula353_Sobrinho("Ana");
		/* para haver uma relação BI-DIRECIONAL --- MUITOS PARA MUITOS deve haver uma consistência nos dados
		 * por assim dizer
		 * por isso que se linkar um tio a um sobrinho, deve haver também a ligação entre o sobrinho e este tio */
		tia.getSobrinhos().add(sobrinho);
		sobrinho.getTios().add(tia);
		tia.getSobrinhos().add(sobrinha);
		sobrinha.getTios().add(tia);
		
		tio.getSobrinhos().add(sobrinho);
		sobrinho.getTios().add(tio);
		tio.getSobrinhos().add(sobrinha);
		sobrinha.getTios().add(tio);
		
		Aula343_DAO<Object> dao = new Aula343_DAO<>();
		dao.abrirTransacao().incluir(tia).incluir(tio).incluir(sobrinho).incluir(sobrinha).fecharTransacao();
		dao.fechar();
	}
}

Põe um printStacktrace na exceção ali onde você tenta criar a EntityManagerFactory, senão não vai descobrir o erro.

Boa noite irmão, eu coloquei o printStacktrace, porém ainda não consegui resolver o problema, abaixo segue a classe

package infra;

import java.util.List;

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

//utilizando GENERICS ==> <E>
public class Aula343_DAO <E> {
	private static EntityManagerFactory emf;
	private EntityManager em;
	private Class<E> classe;
	
	static {
		try {
			emf = Persistence.createEntityManagerFactory("Secao16_JavaPersistenceAPI");
		} catch (Exception e) {
			e.printStackTrace();
			/* logar usando => log4j
			 * por ser uma rotina de acesso ao banco de dados, o instrutor indica a utilização do LOG4J 
			 * para criar LOGS na inicialização */
		}
	}
	
	public Aula343_DAO () {
		this(null);
	}

	public Aula343_DAO (Class<E> classe) {
		this.classe = classe;
		//em = emf.createEntityManager();
		try {
			em = emf.createEntityManager();
		} catch (Exception e) {
			e.printStackTrace();
		}
	};
	//início dos métodos que retornam a própria classe
	public Aula343_DAO<E> abrirTransacao(){
		em.getTransaction().begin();
		return this;
	}
	
	public Aula343_DAO<E> fecharTransacao(){
		em.getTransaction().commit();
		return this;
	}
	
	public Aula343_DAO<E> incluir(E entidade) {
		em.persist(entidade);
		return this;
	}
	
	public Aula343_DAO<E> incluirAtomico(E entidade) {
		return this.abrirTransacao().incluir(entidade).fecharTransacao();
	}
	//fim dos métodos que retornam a própria clase
	 
	public E obterPorID(Object ID) {
		return em.find(classe, ID);
	}
	
	public List<E> obterTodos(){
		return this.obterTodos(0,0);
	}
	
	public List<E> obterTodos(int qtde, int deslocamento){
		if (classe == null) {
			throw new UnsupportedOperationException("Classe nula");
		}
		//jpql => java persistence query linguage
		String jpql = "select e from " + classe.getName() + " e";
		TypedQuery<E> query = em.createQuery(jpql, classe);
		//PAGINAÇÃO
		//quantos registros deseja retornar na consulta
		if (qtde > 0) {
			query.setMaxResults(qtde);
		}
		/* o deslocamento indica onde irá iniciar a consulta ou resultado da consulta
		 * ex: se indicar 10 significa que o resultado retornada do 10º registro encontrado */
		if (deslocamento > 0) {
			query.setFirstResult(deslocamento);
		}
		return query.getResultList();
	}
	
	public void fechar() {
		/* aqui estou fechando apenas o ENTITYMANAGER porque o ENTITYMANAGERFACTORY é STATICO, será criado apenas
		 * uma única vez*/
		em.close();
	}	
}

o erro apresentado com o printStackTrace é:

jun. 10, 2024 10:38:05 PM javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver log

WARNING: javax.persistence.spi::No valid providers found.

javax.persistence.PersistenceException: No Persistence provider for EntityManager named Secao16_JavaPersistenceAPI

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)

at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)

at infra.Aula343_DAO.<clinit>(Aula343_DAO.java:25)

at teste.muitospramuitos.Aula353_NovoTioSobrinho.main(Aula353_NovoTioSobrinho.java:26)

java.lang.NullPointerException: Cannot invoke "javax.persistence.EntityManagerFactory.createEntityManager()" because "infra.Aula343_DAO.emf" is null

at infra.Aula343_DAO.<init>(Aula343_DAO.java:42)

at infra.Aula343_DAO.<init>(Aula343_DAO.java:35)

at teste.muitospramuitos.Aula353_NovoTioSobrinho.main(Aula353_NovoTioSobrinho.java:26)

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "javax.persistence.EntityManager.getTransaction()" because "this.em" is null

at infra.Aula343_DAO.abrirTransacao(Aula343_DAO.java:49)

at teste.muitospramuitos.Aula353_NovoTioSobrinho.main(Aula353_NovoTioSobrinho.java:27)

Ainda perdido nessa situação.

Os seguintes JARs estão nas dependências do seu projeto?

  • hibernate-core
  • hibernate-entitymanager
  • mysql-connector-java
  • javax.persistence-api

Seu arquivo persistence.xml está em qual pasta?

Verifique a versão do MySQL Driver.
Note que o driver JDBC do MySQL mudou de com.mysql.jdbc.Driver para com.mysql.cj.jdbc.Driver em versões mais recentes.
Considere alterar a linha no persistence.xml para:

<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>

O printStacktrace não é pra resolver, é pra que vc veja mais detalhes do erro. Por exemplo, veja as mensagens que aparecem no começo:

WARNING: javax.persistence.spi::No valid providers found.
javax.persistence.PersistenceException: No Persistence provider for EntityManager named Secao16_JavaPersistenceAPI

Aqui vc já tem um ponto de partida. Comece pesquisando pela mensagem de erro. Por exemplo, fiz uma pesquisa por “No Persistence provider for EntityManager named e um dos primeiros resultados foi este link. Ali tem várias causas possíveis para o erro, sugiro que vc confira uma a uma.

Aliás, várias dessas causas já foram listadas acima: o projeto deve ter as dependências adequadas, o persistence.xml deve estar na pasta correta, a classe do driver deve ser uma específica, etc.

Bom dia irmão, eu notei essa diferença na questão do driver do mysql, mas não achei que faria diferença, farei alteração e irei testar. O arquivo persistence.xml está na pasta META-INF. Por enquanto muito obrigado pela ajuda.

Bom dia irmão, Hugo. Eu sei que o printStacktrac não é para resolver, porém por ser iniciante em Java ainda estou perdido na busca. Mas irie utilizar as informações e link repassado para buscar uma solução. Muito obrigado.

Boa noite Staroski
a versão do mysql é a 8.0.36. Das depdêncis mencionadas, a dependência hibernate-entitymanager não tenho no projeto eu tenho hibernate-commons-annotations.
Eu fiz a alteração do nome do driver.

Então experimenta colocar.

Bom dia irmão, vou testar sim, muito obrigado pela ajuda.

Boa noite irmão, desculpe a demora. Eu adicionei a dependência hibernate-entitymanager. Reinstalei o Java e também o eclipse, porém o erro apresentado ainda é o mesmo:

jun. 17, 2024 11:03:17 PM javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver log
ADVERTÊNCIA: javax.persistence.spi::No valid providers found.
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "javax.persistence.EntityManager.getTransaction()" because "this.em" is null
	at infra.Aula343_DAO.abrirTransacao(Aula343_DAO.java:52)
	at teste.muitospramuitos.Aula353_NovoTioSobrinho.main(Aula353_NovoTioSobrinho.java:27)