A anotação: @PersistenceContext não instancia o EntityManager

Boa tarde pessoal.

Bom, o ambiente de desenvolvimento que estou utlizando: Glassfish v3 + Hibernate 3.5.1 + EJB 3.1 + JPA 2.0 + J2EE 6.

Estou tentando instanciar um objeto EntityManager utilizando a anotation @PersistenceContext da seguinte forma:

@Stateless
public class UsuarioFacadeImpl implements UsuarioFacade {

	@PersistenceContext(unitName="testePU")
	private EntityManager em;

Meu persistence.xml está em “src/META-INF/” do projeto EJB:

<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">
	<persistence-unit name="testePU" transaction-type="JTA">
  		<provider>org.hibernate.ejb.HibernatePersistence</provider> 
  		<jta-data-source>jdbc/teste</jta-data-source>
  		<properties>
          <property name="hibernate.show.sql" value="true" />
 		  <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
  		</properties>
  	</persistence-unit>
</persistence>

Quando tento utilizar:

recebo um NullPointerException, indicando que o objeto em está null.

Preciso do @PersistenceContext porque quero que o container cuide das transações.

Estou desconfiado que esteja faltando alguma lib, pois já li muita, mas muita coisa mesmo a respeito e não encontrei a solução, nos tutoriais e posts encontro dicas para utilizar o que já utilizo no meu projeto. Vocês sabem me dizer quais libs são necessárias para este caso?

Obrigado.

e ai man… estou com o mesmo problema… ainda não consegui solução para instanciar pela anotação… tanto usando Resource_Local quando JTA…

mas tem um jeito meio que “resolver” isso ai… tenta isso aqui:

Inserir esses métodos embaixo seu:

@PersistenceContext(unitName="testePU") private EntityManager em;

Métodos:

           public EntityManager getEntityManager() throws DAOException {
		try {

			if (entityManager == null) {
				AppLogUtil.infoLog("entityManager == null");
				entityManager = EntityManagerFactory.getEntityManager();
			}else
				AppLogUtil.infoLog("entityManager - ok");
		} catch (Exception e) {
			logger.error(e.getCause());
			throw new DAOException(e);
		}

		return entityManager;
	}

	/**
	 * Retorna um objeto do tipo EntityManager. Este e usado para fazer acesso
	 * aos dados.
	 * 
	 * @return {@link EntityManager}
	 * @param {@link String}
	 * @throws DAOException
	 */
	public synchronized EntityManager getEntityManager(String persistenceUnit) throws DAOException {

		try {
			if (entityManager == null)
				entityManager = Persistence.createEntityManagerFactory(persistenceUnit).createEntityManager();

			return entityManager;

		} catch (Exception e) {
			logger.error(e.getCause());
			throw new DAOException(e);
		}

	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

EntityManagerFactory.java:

import java.io.Serializable;

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

import org.apache.log4j.Logger;

@SuppressWarnings("serial")
public class EntityManagerFactory implements Serializable {

	public static final String PERSISTENCE_UNIT = "ProjetoImobiliaria";

	protected static final Logger LOGGER = Logger.getLogger(EntityManagerFactory.class);

	protected static EntityManager entityManager;

	public static EntityManager getEntityManager() {

		if (entityManager == null) {
			LOGGER.info("Criando o EntityManager");

			javax.persistence.EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);

			LOGGER.info("Finalizando criação do EntityManager");
			entityManager = factory.createEntityManager();
		}
		return entityManager;
	}

	public static void setEntityManager(EntityManager entityManager) {
		EntityManagerFactory.entityManager = entityManager;
	}

}

qualquer coisa é só gritar o/*

Bom dia Leandro,

Estou com o mesmo problema que você, ja tentei a solução do darkan666 porém sem sucesso, recebo um erro no deploy, reclamando que o synchronized não pode ser usado com o modulo ejb, no meu caso preciso usar o ejb por determinação da empresa.

você conseguiu alguma solução?

abraços

Como você está instanciando o EJB ?

@ManagedBean
@SessionScoped
public class LoginBean implements Serializable {

....


@EJB (name="JpaUserDAO")
private IUserDAO userDAO;

Segue, não esta da melhor forma, mas a principio o objetivo é fazer funcionar…depois acertar as camadas

@ManagedBean
@SessionScoped
public class LoginBean implements Serializable {

        ...
	
	@EJB (name="JpaUserDAO")
	private IUserDAO userDAO;

        ....

        user = userDAO.login(username, password);

implementação

@Stateless(name="JpaUserDAO")
public class JpaUserDAOImpl extends GenericDao implements IUserDAO {

    @PersistenceContext
    private EntityManager entityManager;

quando vou acessar o atributo entityManager recebo um mensagem de InvocationException.

[]'s

que mensagem ?

Não lembro exatamente o erro, mas era algo avisando que ao invocar o atributo foi lançado uma exceção InvocationException.

Isso debugando, antes de acessar o entityManagar, inpecionando o elemento aparece essa msg.

[]'s

Debugando quando vou inspecionar o entityManager aparece a msg:

com.sun.jdi.InvocationException occurred invoking method.

e se continuo da nullpointerexception

[]'s

posta a stacktrace, amigão.

seu EJB é injetado normalmente ? você não dá nenhum new nele?

Eh injetado sim…cara não consigo pegar o stack…estou subindo o server pelo cmd e fazendo maior gambiarra pra conseguir debugar…não consigo pegar stacktrace.

mas o ejb ta indo normal…só da pau mesmo da hora que vai acessar o entityManager.

[]'s

vou tentar pegar aqui o stack…se conseguir posto aqui

Tem 2 coisas que você precisa verificar:

  • o datasource jdbc/teste está configurado ? A configuração de datasource é particular para cada servidor de aplicação

  • você está distribuindo o Hibernate com a sua aplicação ? No seu persistence.xml você declara explicitamente que o provedor de persistência deverá ser o Hibernate. Nesse caso, você tem que incluir os .jar do Hibernate na sua aplicação também. Uma outra alternativa é remover a tag . Nesse caso, o servidor vai usar o provedor padrão, que no caso do Glassfish é o TopLink.

O meu datasource esta configurado corretamente, no console do weblogic seu status esta ok.

no persistence eu declaro que o hibernate vai fazer a persistencia.

<persistence-unit name="ourEntityManager"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>jdbc/oracle</jta-data-source> <class>....dao.impl.JpaUserDAOImpl</class> <class>....dao.impl.RepositorySessionImpl</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/> </properties> </persistence-unit>

porem quando vou rodar a aplicação, debugando percebo que o entity manager esta instanciado, porem quando vou inspecionar o objeto aparece apenas essa msg

com.sun.jdi.InvocationException occurred invoking method.

estou declarando o entitymanager assim

@PersistenceContext private EntityManagerFactory emf;

Estou tentando de tudo, porém sem sucesso, ja implementei varias soluções que achei no google, porém todas sem sucesso. Todas dão o mesmo erro.
Eu até consigo instanciar um EntityManagerFactory porem quando vou criar o entityManager da sempre a mesma msg.

Se alguem puder dar um help agradeço.

Valeu

abraços