Erro ao excluir registro JSF/JPA - "EntityManager is closed"

1 resposta
gRoOve

Galera estou com problema ao excluir um registro, estou usando JPA com Hibernate e JSF. Eu consigo excluir o registro porém ocorre está mensagem “EntityManager is closed”. Vejam meu código:

CategoriaServicoDAO

package com.modelo.dao;

import com.modelo.bean.CategoriaServico;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class CategoriaServicoDAO {

	private EntityManagerFactory factory = null;
	private EntityManager manager = null;
	
	public CategoriaServicoDAO() {
		factory = Persistence.createEntityManagerFactory("TurismoGuiadoPU");
		manager = factory.createEntityManager();
	}
	
	public boolean excluirCategoriaServico(CategoriaServico categoriaServico){
		EntityTransaction transaction = manager.getTransaction();
		
		try {
			transaction.begin();
			manager.remove(categoriaServico);
			transaction.commit();
			return true;
		} catch (Exception e) {
			transaction.rollback();
			System.err.println("Erro: " + e.getMessage());
			return false;
		} finally {
			manager.close();
		}
	}
	
	public CategoriaServico recuperarCategoriasServico(int idCategoriaServico){
		EntityTransaction transaction = manager.getTransaction();
		
		CategoriaServico categoriaServico = manager.find(CategoriaServico.class, idCategoriaServico);
		return categoriaServico;
	}
	
}

CategoriaServicoMB

package com.modelo.managedBean;

import com.modelo.bean.CategoriaServico;
import com.modelo.dao.CategoriaServicoDAO;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;

@ManagedBean
public class CategoriaServicoMB {

	private Integer id;
	private CategoriaServicoDAO categoriaDAO = new CategoriaServicoDAO();
	private CategoriaServico categoriaServico = new CategoriaServico();
	private List<CategoriaServico> categorias = new ArrayList<CategoriaServico>();

	// GETTER / SETTER
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
		if (id != null) {
			categoriaServico = categoriaDAO.recuperarCategoriasServico(this.getId());
		}
	}

	public CategoriaServico getCategoriaServico() {
		return categoriaServico;
	}

	public void setCategoriaServico(CategoriaServico categoriaServico) {
		this.categoriaServico = categoriaServico;
	}

	public List<CategoriaServico> getCategorias() {
		categorias = categoriaDAO.listarCategoriaServico();
		return categorias;
	}

	// REGRAS DE NEGÓCIO
	public void salvar() {
		if (categoriaDAO.inserirCategoriaServico(categoriaServico)) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Operação realizada com sucesso!", null));
		} else {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao executar operação!", null));

		}
	}

	public void excluir() {
		categoriaServico = categoriaDAO.recuperarCategoriasServico(categoriaServico.getIdCategoriaServico());
		categoriaDAO.excluirCategoriaServico(categoriaServico);
	}

	public void atualizar() {
		if (categoriaDAO.atualizarCategoriaServico(categoriaServico)) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Operação realizada com sucesso!", null));
		} else {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao executar operação!", null));

		}
	}
}

Este problema ocorre somente quando vou excluir, quero fazer igual tava fazendo nos outros dois métodos atualizar e salvar, gravar a mensagem no FacesContext.

Obs.: Eu estava utilizando o código assim e estava funcionando normalmente, nao entendi pq ocorre isso "/

public String excluir() {
		categoriaServico = categoriaDAO.recuperarCategoriasServico(categoriaServico.getIdCategoriaServico());
		if (categoriaDAO.excluirCategoriaServico(categoriaServico)) {
			return "sucessoOperacao";
		} else {
			return "falhaOperacao";
		}
	}

1 Resposta

gRoOve

Acho que postei no lugar errado, poderiam mover pra área de Banco de dados?

Criado 27 de março de 2012
Ultima resposta 28 de mar. de 2012
Respostas 1
Participantes 1