Olá pessoal, estou tentando adicionar um usuário via VRaptor na minha aplicação mas na hora de enviar os dados é lançada uma "IllegalStateException:EntityManager is closed", acusando minha classe UsuarioLogic na linha:
public void adiciona (Usuario usuario) {
this.daoFactory.beginTransaction(); // ESTA LINHA<<<<<<<<<<<<<<<
this.daoFactory.getUsuarioDao().adiciona(usuario);
this.daoFactory.commit();
}
…que por consequencia minha DaoFactory:
public void beginTransaction () {
tx = this.manager.getTransaction();
tx.begin(); // NESTA LINHA<<<<<<<<<<<<<<<
}
Estou usando um DaoInterceptor para fazer a injeção do DaoFactory nas classes de lógica:
Onde você está injetando o EntityManager? Pois o que está acontecendo é que você está tentando abrir uma transação a partir de um EntityManager que já foi fechado.
L
leandronsp
Valeu Guilherme, arrumei este problema, pois na minha classe JpaUtil, meu EntityManager era uma variável estática, e a cada requisição, ele estava sendo fechado pelo Interceptor.
Agora, todos que pedem um EntityMAnager, recebe um novo, e não um da classe:
Aproveitando o gancho do tópico… tbm estou com a mesma situação…
Estou com o seguinte DAO Genérico…
packagecom.wordpress.aohana.gecon.geral.base;importcom.wordpress.aohana.gecon.geral.interfaces.IBaseDAO;importjava.util.List;importjavax.persistence.EntityManager;importjavax.persistence.EntityManagerFactory;importjavax.persistence.Persistence;/** * Classe Abstrata que implementa os metodos de persistencia da aplicaçao, * recebendo a Entidade necessaria atraves de um generico <T>. * * @author Adriano Ohana * @since Abril 15, 2009 */publicabstractclassBaseDAO<T>implementsIBaseDAO<T>{privatestaticEntityManagerFactoryemf=Persistence.createEntityManagerFactory("GECONPU");privatestaticEntityManagerem=emf.createEntityManager();publicvoidpersist(Tentidade){em.getTransaction().begin();try{em.persist(entidade);em.getTransaction().commit();}catch(Exceptione){e.printStackTrace();em.getTransaction().rollback();}}publicList<T>findByAll(Stringquery){try{returnem.createNamedQuery(query).getResultList();}catch(Exceptione){e.printStackTrace();returnnull;}}publicList<T>findByName(Stringquery,Stringnome){try{returnem.createNamedQuery(query).setParameter("nome","%"+nome.toUpperCase()+"%").getResultList();}catch(Exceptione){e.printStackTrace();returnnull;}}publicstaticvoidfecharConexao(){em.close();}}
Esse último método fecharConexao() eu acabei de implementar pra fechar a conexao somente quando o Sistema sai… porém não é bem isso que eu queria… queria abrir e fechar a conexao sempre que fosse executar alguma intrução de persistencia na base… Teria que criar esse EntityManager dentro dos meus métodos e abrir e fechar a cada INSERT, UPDATE e DELETE ???
Valew Galera
L
leandronsp
Uma sugestão:
O ideal seria vc fazer um método separado para abrir a conexão, outro para commit, outro para close, e assim por diante, todos dentro dessa Dao.
A idéia é que, a classe que instanciar esse Dao, ela faça a abertura da conexão, a persistência, e tbm feche a conexão.