Ola.
Eu estou tentando injetar o EntityManager no meu mecanismo de persistencia porem esta ocorrendo NullPointerException
Eu consigo injetar o EntityManager no meu MangedBean, porem não consigo fazer isso no mecanismo de persistencia.
Segue código abaixo:
[code]
//Classe generica de persistencia
public class GenericJPA<T> implements GenericRepository<T>{
@PersistenceContext(name = "persistence/LogicalName", unitName = "ToplinkJPA")
protected EntityManager em;
public void makePersistent(T entity){
em.persist(entity);
}
public void makeTransient(T entity){
em.remove(entity);
}
// implementacao de outras funcoes genericas
}
//Implementacao das classes de persistencia
public class LoginJPA extends GenericJPA<Login>{
//Um metodo qualquer que não generico
public List<Login> list(){
return em.createQuery(“from Login login”).getResultList();
}
}[/code]
Alguem sabe como ajustar isso ?
Desde ja obrigado
Primeira coisa… Não injete o entityManager no managed bean. Principalmente se estiver utilizando o hibernate como provedor de persistência. Se realmente precisar fazer isso utilize o toplink essencials para não ter dores de cabeça com concorrência.
Ops , agora que eu vi que vc tá utilizando o toplink. hehehe
E detalhe, vc somente consegue fazer essa injeção em objetos gerenciados pelo container. Classes não gerenciadas não são passíveis de injeção.
Ok, entendi.
Eu agora consegui injetar o PersistenceContext porque a minha classe é um EJB, como o EJB é gerenciado pelo container esta tudo funcionando.
Porem eu nao acho correto que meu EJB de serviço tenha conhecimento de como é feito a persistencia, portanto criei o seguinte código:
//Meu EJB de servico para o dominio Login
@Stateless
public class LoginSessionFacadeImpl implements LoginSessionFacade {
@EJB
private DAOFactoryFacade factory;
public void persist(Person person) {
PersonRepository personRepository = factory.getPersonRepository();
personRepository.persist(person);
}
public void persist(Login login) {
LoginRepository loginRepository = factory.getLoginRepository();
loginRepository.persist(login);
}
}
//Meu EJB de persistencia
@Stateless
public class DAOFactoryFacadeImpl implements DAOFactoryFacade{
@PersistenceContext
private EntityManager em;
public LoginRepository getLoginRepository(){
return new LoginDAO().setEntityManager(em);
}
...outras instancias de repositorios
}
A minha duvida é: Cade o controle de transação ? Ficou dentro do Repositorio !?
Não sei se já percebeu. Sei também que num “cheira bem”, mas com TopLink você pode abrir e fechar as transações no seu DAO genérico.
Claro que não é legal, mas ele aceita e gerencia numa boa a sessão.
A minha pergunta é: Quem já fez um DaoFactory para trabalhar com TopLink?
Abraços
[quote=ajaxinaction]Não sei se já percebeu. Sei também que num “cheira bem”, mas com TopLink você pode abrir e fechar as transações no seu DAO genérico.
Claro que não é legal, mas ele aceita e gerencia numa boa a sessão.
A minha pergunta é: Quem já fez um DaoFactory para trabalhar com TopLink?
Abraços
[/quote]
As classes citades foram criadas por mim, inclusive a fabrica, talvez o nome da classe seja ruim, pois ela é uma fabrica e ao mesmo tempo um EJB.
A classe DAOFactoryFacadeImpl é a responsável por receber o EntityManager através de injeção de dependencia, como ela é um EJB a injeção do EntityManager funciona pois o EJB é gerenciado pelo container.
Após a DAOFactoryFacadeImpl receber o EntityManager por injeção, ele será responsável por criar as instancia dos meus DAOs, funcionando como uma fábrica pois é necessario que meus DAOs recebam o EntityManager dessa fábrica.
Os meus DAOs não podem receber uma injeção do EntityManager pois eles não são gerenciados pelo container.
Talvez isso tudo esteja errado !? não sei! pois estou migrando para o Toplink agora, junto com EJB3
Alguma idéia ? o que me causa espanto :shock: é que até o momento eu nao fiz controle de transações, e mesmo assim as entidas estao sendo persistidas