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";
}
}