NullPointerException usando JPA

4 respostas
Andre_Brito

Oi pessoal.

Estou estudando JPA com TopLink e MySQL. No entanto, estou com um problema que não consigo encontrar onde pode estar dando caca.
A exception é a seguinte:

<blockquote>Exception in thread “main” java.lang.NullPointerException

at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createEntityManagerFactory(EntityManagerFactoryProvider.java:120)

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

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

at br.com.NFL.persistencia.JogadorDAO.(JogadorDAO.java:17)

at br.com.NFL.negocio.NegocioJogador.inserirJogador(NegocioJogador.java:11)

at br.com.NFL.teste.Teste.main(Teste.java:13)</blockquote>

Meu persistence.xml está assim:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" 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_1_0.xsd">
  
  <persistence-unit name="jogadores" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
    <class>br.com.NFL.modelo.Jogador</class>
    <properties>
      <property name="toplink.logging.level" value="INFO"/>
      <property name="toplink.jdbc.url" value="jdbc:mysql://localhost/jogadores"/>
      <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="toplink.jdbc.user" value="root"/>
      <property name="toplink.jdbc.password" value=""/>
      <property name="toplink.ddl-generation" value="create-tables"/> 
    </properties>
  </persistence-unit>
  
</persistence>

E minha classe de DAO está assim:

package br.com.NFL.persistencia;

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

import br.com.NFL.modelo.*;

public class JogadorDAO {
	
	private EntityManagerFactory factory = null;
	
	private EntityManager em = null;
	
	public JogadorDAO() {
		factory = Persistence.createEntityManagerFactory("jogadores");
		em = factory.createEntityManager();
	}
	
	public void adicionarJogador(Jogador novoJogador) {
		EntityTransaction transacao = em.getTransaction();
		
		try {
			transacao.begin();
			
			em.persist(novoJogador);
			
			transacao.commit();
		} catch (Exception e) {
			transacao.rollback();
			
			System.err.println("Erro: " + e.getMessage());
		} finally {
			em.close();
		}	
	}
	
	public Jogador pesquisarJogador(Integer codigo, Jogador jogador) {
		EntityTransaction transacao = em.getTransaction();
		
		Jogador retorno = null;
		
		try {
			transacao.begin();
			
			retorno = (Jogador)em.find(Jogador.class, codigo);
		} catch (Exception e) {
			transacao.rollback();
			
			System.err.println("Erro: " + e.getMessage());
		} finally {
			em.close();
		}
		
		return retorno;
	}

}

Alguém pode me dizer aonde estou fazendo coisas erradas?

Abraço.

4 Respostas

nadilsons

[quote=Andre Brito]Oi pessoal.
[/code]
public class JogadorDAO {

private EntityManagerFactory factory = null;

private EntityManager em = null;





Parece que faltam as anotações @PersistentContext ou @PersistentUnit no seu código
Andre_Brito

nadilson,

Pode me dizer em qual parte eu devo colocar essas Anotações?

Abraço.

[editado]
Esqueci de dizer: é aplicação desktop.

Conversando com um amigo meu que entende do assunto, coloquei a anotação na linha anterior à declaração do EntityManager.
Dessa forma, o DAO fica assim:

package br.com.NFL.persistencia;

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

import br.com.NFL.modelo.*;

public class JogadorDAO {
	
	@PersistenceContext(unitName = "jogadores")
	private EntityManager em;
	
	public JogadorDAO() {
		
	}
	
	public void adicionarJogador(Jogador novoJogador) {
		//EntityTransaction transacao = em.getTransaction();
		
		try {
			//transacao.begin();
			
			em.persist(novoJogador);
			
			//transacao.commit();
		} catch (Exception e) {
			//transacao.rollback();
			
			System.err.println("Erro: " + e.getMessage());
		} finally {
			em.close();
		}	
	}

//...
}

Mas o NullPointerException é na hora de dar o persist ou chamar a transaction (o begin e depois o commit). E, de fato, acho que isso faz sentido, pois não inicializo o EM.

Abraço.
[/editado]

nadilsons

Desculpe-me a demora.

Bem, como você está em uma aplicação standalone, não existe um servidor que injete na sua classe o EntityManager. Então, você tem que obtê-lo manualmente createEntityManager do EntityManagerFactory

Este link, com certeza, vai te ajudar:

Até

Andre_Brito

Oi nadilson,

Eu não li o link ainda, mas conversei hoje na aula com um colega que entende do assunto e vi que o META-INF estava fora dos pacotes. Acho que foi isso. Agora está funcionando tudo beleza.

Valeu cara!
Abraço.

Criado 13 de março de 2009
Ultima resposta 16 de mar. de 2009
Respostas 4
Participantes 2