Null Pointer em um select através de JPA

Bom dia pessoas, estou começando com JPA, e tentei fazer um estoque para começar, consegui inserir e deletar perfeitamente, mas quando tento pesquisar um registro ele não encontra, mesmo estando com o ID correto!

Fonte que busca da tabela:

[code]@Override
public Produto getProduto(int id) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory(databaseName);
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
Produto prod = null;

	try{
		transaction.begin();
		prod = em.find(Produto.class, id);
		transaction.commit();
	}
	catch(Exception e){
		return null;
	}
	finally{
		em.close();
		emf.close();
	}
	return prod;
}[/code]

Main class:

[code]public class Main {

public static void main(String[] args) {
	GerenciaProduto gp = new GerenciaProduto();
//	Produto p = new Produto("broca", "produto em aço", 200);

	//gp.adicionaProduto(p);
	//gp.removeProduto(1);
	Produto newp = gp.getProduto(4);
	System.out.println(newp);
	
	System.out.println(newp.toString());
	
}

}[/code]

Oi Gui, como vai?

Nesse código que você mostrou, não ficou claro onde está acontecendo a NPE. Sabe nos apontar onde é?

Outra coisa, uma dica na verdade, é que você pode ter problemas tratando a exceção daquela forma no seu método getProduto. Isso porque, quando há uma exceção, você retorna null, e lá na frente, quando a execução do código continuar, você tomará uma NullPointerException, pois você invoca métodos nesse produto que deveria ter sido retornado. O problema é… e se no meio do caminho a transação falhou? Você continuará recebendo a NPE lá na frente e vai ficar perdido, sem saber que a transação falhou. A gente costuma chamar isso de “engolir” a exceção original.

Uma alternativa, minha preferida no caso, é você nem tratar a exceção dentro do getProduto. Deixe-a acontecer, assim, se acontecer a exceção, o seu main irá falhar mostrando o que efetivamente aconteceu.

Abraço