Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

java.lang.IllegalStateException ao passar de Detached para Managed

Boa tarde,

Ao criar um novo EntityManager e utilizar o merge() para reviver a conta esta retornando este erro:

java.lang.IllegalStateException ao passar de Detached para Managed

Segue o código criado conforme vídeo-aula:

public static void main(String[] args) {
        EntityManager manager = new JPAUtil().getEntityManager();
        manager.getTransaction().begin();

        Conta conta = manager.find(Conta.class, 1);

        conta.setTitular("Jeferson");
        conta.setAgencia("Itau Unibanco");

        System.out.println(conta.getTitular());

        manager.getTransaction().commit();

        manager.close();

        EntityManager manager2 = new JPAUtil().getEntityManager();
        manager.getTransaction().begin();

        conta.setTitular("CAique");
        manager2.merge(conta);

        manager2.getTransaction().commit();
        manager2.close();
    }
3 respostas

Opa tudo bem? poderia passar o erro do console inteiro? Cara não sei aonde está o seu erro, porque o seu objeto está managed, e depois que você fecha a transação com o close e depois abre la embaixo uma outra, ele já fica datached, o find busca o objeto e ele fica datached, depois você usa o merge para atualizar o seu objeto fazendo com ele fica managed denovo, mais não to vendo o erro. Poderia passar o erro inteiro?

No curso, segui o exemplo de passar um objeto que está como Datached ao dar um manager.close() para Managed utilizando o merge(), para isso foi necessário criar uma nova Instância do EntityManager (Foi isso que entendi).

Ao fazer isto, no console retorna o seguinte erro:

Exception in thread "main" java.lang.IllegalStateException: org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@1dce0e6 is closed at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.errorIfClosed(AbstractLogicalConnectionImplementor.java:37) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:144) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:263) at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:271) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:203) at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:56) at br.com.caelum.financas.teste.TesteBuscaConta.main(TesteBuscaConta.java:25)

solução!

A correto o seu erro tá aqui.

EntityManager manager2 = new JPAUtil().getEntityManager();
        manager.getTransaction().begin(); // apaga aqui
     manager2.getTransaction().begin(); // e deixa assim
        conta.setTitular("CAique");
        manager2.merge(conta);

        manager2.getTransaction().commit();
        manager2.close();
    }

Veja se resolveu e me avisa se era isso mesmo kk abraço