Problema com EntityManager

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!