Consulta JPA - Retornar um objeto

13 respostas
gRoOve

Galera estou tentando retornar um objeto consultando com JPA mas fica dando erro: “EntityManager is closed”, eu acho que estou fazendo errado o método que busca, vejam se está correto isso que fiz:

public CategoriaServico recuperarCategoriasServico(int idCategoriaServico) {
		EntityTransaction transaction = manager.getTransaction();

		try {
			transaction.begin();
			CategoriaServico categoriaServico = manager.find(CategoriaServico.class, idCategoriaServico);
			transaction.commit();
			return categoriaServico;
		} catch (Exception e) {
			transaction.rollback();
			System.err.println("Erro: " + e.getMessage());
			return null;
		} finally {
			manager.close();
		}
	}

No meu ManagedBean eu chamo este método, dai com resultado dele, chamo o método pra excluir já, assim:

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

13 Respostas

Hebert_Coelho

Em qual lugar do código exatamente dá esse erro?

gRoOve

Quando chama o excluirCategoriaServico, já na primeira linha transaction.begin() cai num Trowable loco que nem sei de onde vem, ai executa o catch e da a mensagem de erro.

Hebert_Coelho

Oq vc poderia fazer era abrir a transação antes do método
recuperar, passar o entityManager como parâmetro tanto para o recuperar como para o excluir.
Nisso você abre e fechar apenas uma vez.

gRoOve

Você acha que pode ser isso? Mas não faz sentido =((
Antes eu estava fazendo assim:

public void excluir() {  
    categoriaServico = categoriaDAO.recuperarCategoriasServico(categoriaServico.getIdCategoriaServico());  
    if(categoriaDAO.excluirCategoriaServico(categoriaServico)) {
        return "sucessoOperacao"; // direcionava pra outra página
    }
}

e funcionava normalmente, agora eu estava querendo colocar messages quando retorna true assim:

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Falha ao executar operação!", null));

o método de adicionar funciona de boa o messages "/

Hebert_Coelho

Eita ferro, agora q eu reparei q você usa um tal de EntityTransaction.

Isso é do Spring? Não sei te ajudar nesse caso. sorry.

gRoOve

É da especificação JPA…o que eu faço agora?

Hebert_Coelho

gRoOve:
É da especificação JPA…o que eu faço agora?
Como está seu persistence.xml? Sua transação tá local?

gRoOve

Parece ser local, haha.
Persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="TurismoGuiadoPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.modelo.bean.CategoriaServico</class>
    <class>com.modelo.bean.PontoInteresse</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.connection.username" value="kauan"/>
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
      <property name="hibernate.connection.password" value="kauan"/>
      <property name="hibernate.connection.url" value="jdbc:mysql://10.128.3.1:3306/TurismoGuiado"/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>
Hebert_Coelho

Eu vou ser honesto, o único modo que eu vi local até hoje é o que está igual ao desse post aqui: Tutorial Hibernate 3 com JPA 2

Tente fazer assim oh:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("TurismoGuiadoPU");
        EntityManager em = emf.createEntityManager();
 
        try {
            em.getTransaction().begin();
 
           // FAZ oq tiver que fazer aqui
 
            em.getTransaction().commit();
        }
        catch (Exception e) {
            em.getTransaction().rollback();
            e.printStackTrace();
        }
        finally{
            emf.close();
        }
gRoOve

Usa como se não é local então?
Alterei como você falou e o erro continua o mesmo…

Hebert_Coelho

Usa por JTA.

Você colocou o código que eu falei nos dois pontos? Tanto no find como no remove?

Hebert_Coelho

Só mais um detalhe, até num livro que eu li, na hora de excluir é feito por exemplo:

public void excluir(Carro carro){ Carro carroDaBase = entityManager.find(....); entityManager.remove(carroDaBase); }Eu acho que dá problema lá também pelo fato de que o objeto precisa estar dentro da transação. Se você abre e fecha em um método, no outro ele já não está mais sincronizado com o DB, ou seja, ele está detached.

Por isso q eu falei para você passar o entityManager e abrir e fechar uma vez só.

gRoOve

Ah cara eu vou voltar a usar como tava mesmo, ta funcionando de boa assim. Isso é meu TCC e tenho prazo pra entregar, não vou ficar me matando pra tentar achar esse erro ai, sendo que eu nem manjo nada…to fazendo na base do google só :slight_smile:
Mas valeu pela ajuda ai.

Criado 2 de abril de 2012
Ultima resposta 2 de abr. de 2012
Respostas 13
Participantes 2