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
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