Prazados,
estou utilizando um JPAFilter para fazer as transações necessárias, porém em algum momento acontece a seguinte exceção:
java.lang.IllegalStateException: EntityManager is closed
O que pode estar acontecendo???
JPAFilter
[code]import java.io.IOException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
@WebFilter(servletNames = { “Faces Servlet” })
public class JPAFilter implements Filter {
private EntityManagerFactory factory;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.factory = Persistence.createEntityManagerFactory("conexao-PU");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// CHEGADA
// --- Permite que acentos etc sejam inseridos corretamento no banco de dados.
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
EntityManager manager = this.factory.createEntityManager();
request.setAttribute("EntityManager", manager);
manager.getTransaction().begin();
// CHEGADA
// FACES SERVLET
chain.doFilter(request, response);
// FACES SERVLET
// SAÍDA
try {
manager.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
manager.getTransaction().rollback();
} finally {
manager.close();
}
// SAÍDA
}
@Override
public void destroy() {
this.factory.close();
}
}
[/code]
Que a melhor maneira de gerenciar um EntityManager com JSF 2.0?
O erro ta claro… em algum momento vc ta fechando o entitymanager…
Em relação ao gerenciamento, sempre usei jpa com spring… na minha opnião a melhor maneira…
Quando eu n usava spring utilizava apenas o hibernate em um dao generico
Mas quem gerencia as EntityManager é a JPAFilter, o que ela está fazendo de errado?
o EntityManager chega null?
Não, ela chega fechada. Estou usando uma @SessionScoped.
public class UnidadeIESRepository {
private EntityManager manager;
public UnidadeIESRepository(EntityManager manager) {
this.manager = manager;
}
public void adiciona(UnidadeIES unidade) {
System.out.println("Persistindo unidadeIES");
if (!this.manager.isOpen()) {
System.out.println("MANAGER ESTÁ FECHADA");
}
this.manager.persist(unidade);
System.out.println("UnidadeIES Persistida");
}
public void remove(Long id) {
UnidadeIES unidade = this.procura(id);
this.manager.remove(unidade);
}
public UnidadeIES atualiza(UnidadeIES unidade) {
return this.manager.merge(unidade);
}
public UnidadeIES procura(Long id) {
return this.manager.find(UnidadeIES.class, id);
}
@SuppressWarnings("unchecked")
public List<UnidadeIES> getLista() {
Query query = this.manager.createQuery("select x from UnidadeIES x");
return query.getResultList();
}
@SuppressWarnings("unchecked")
public List<UnidadeIES> getListaSimples() {
Query query = this.manager
.createQuery("select new UnidadeIES(x.id, x.nome, x.endereco, x.cep, x.telefone1, x.telefone2, x.email, x.coordenada, x.ies, x.localidade ) from UnidadeIES x");
return query.getResultList();
}
@SuppressWarnings("unchecked")
public List<UnidadeIES> getListaParaValidacao() {
Query query = this.manager
.createQuery("select new UnidadeIES(x.id, x.nome, x.endereco, x.ies) from UnidadeIES x");
return query.getResultList();
}
}
Hm… ta…
Eu acho q voce ta injetando o EntityManager numa Request, e depois tenta recupera-lo no Session…
Essa construcao n funciona…
Só funciona se for outra Request…
Vc ta usando Glassfish?
Não, estou usando o TOMCAT 7.0.34
Hm…
Tenta utilizar o @PersistenceContext pra injetar o EntityManager
assim:
@PersistenceContext(name = "FFMPC")
protected EntityManager entityManager;
e no persistence.xml cria seu persistence-unit: (vou postar o meu aki…)
<persistence-unit name="FFMPC" transaction-type="RESOURCE_LOCAL">
<class>br.gov.ms.tce.model.Campo</class>
<class>br.gov.ms.tce.model.Cidade</class>
<class>br.gov.ms.tce.model.Dado</class>
<class>br.gov.ms.tce.model.Dependente</class>
<class>br.gov.ms.tce.model.Escolaridade</class>
<class>br.gov.ms.tce.model.Estado</class>
<class>br.gov.ms.tce.model.EstadoCivil</class>
<class>br.gov.ms.tce.model.Evento</class>
<class>br.gov.ms.tce.model.EventoCampo</class>
<class>br.gov.ms.tce.model.Grau</class>
<class>br.gov.ms.tce.model.Orgao</class>
<class>br.gov.ms.tce.model.Pais</class>
<class>br.gov.ms.tce.model.Pessoa</class>
<class>br.gov.ms.tce.model.PessoaCidade</class>
<class>br.gov.ms.tce.model.PessoaEstado</class>
<class>br.gov.ms.tce.model.PessoaEvento</class>
<class>br.gov.ms.tce.model.Raca</class>
<class>br.gov.ms.tce.model.TipoAdmissao</class>
<class>br.gov.ms.tce.model.TipoAposentadoria</class>
<class>br.gov.ms.tce.model.TipoPessoaEstado</class>
<class>br.gov.ms.tce.model.TipoSanguineo</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql:ffmpc" />
<property name="javax.persistence.jdbc.user" value="postgres" />
<property name="javax.persistence.jdbc.password" value="opa" />
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.connection.useUnicode" value="true"/>
<property name="hibernate.connection.characterEncoding" value="UTF-8" />
<!-- <property name="hibernate.hbm2ddl.auto" value = "validate"/> -->
<!-- property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/hibernate.cfg.xml"/ -->
</properties>
</persistence-unit>
Assim vc nao precisa do JPAFilter
Entendi. Farei isso! Obrigado!