7
respostas

Detached ou Transient?

No video que é ensinado o metodo remove, ele tenta remover a conta sem antes ter buscado ela, para demonstrar que nao é possivel, uma vez que esse objeto ainda não é Managed. Assim sendo, causa uma excecao, e o instrutor fala que a excecao nos diz que nao podemos remover um objeto Detached. Minha duvida é a seguinte: no video ele acaba de criar o objeto conta e setar seus atributos com valores utilizando os metodos setters e logo apos tenta remover, se esse objeto conta NUNCA foi Managed pq a excecao e o instrutor dizem que o objeto era Detached uma vez que pelo que aprendi na aula anterior Detached são objetos que alguma vez ja foram gerenciados pela JPA? Obrigado.

7 respostas

Oi João, tudo bem ?

O correto deve ser transiente mesmo, o detached já foi gerenciado.

Mas entao por que a excecao que é lancada no console fala sobre DETACHED?

Segue abaixo como esta o código no vídeo e comentário explicando a situação, se quiser copie o código e rode no eclipse para entender melhor.

--------------------------//Código//---------------------------------

        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();

        Conta conta = em.find(Conta.class, 1); // Conta já existe então seu estado NÃO é TRANSIENT (pois sua
                                                // característica é justamente nunca ter sido gerenciada pelo banco)
        conta.setTitular("Joao");
        conta.setAgencia("456");

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

        em.getTransaction().commit();
        em.close(); // Aqui encerro a conexão. Quando "matamos" a aplicação, a entidade "morre"  junto, com isso não sendo mais gerenciada pelo JPA//.

        EntityManager em2 = new JPAUtil().getEntityManager();
        em2.getTransaction().begin();

        // Aqui seu estado é Detached, em que a conta não é mais gerenciada pelo JPA,
        // mais existe uma representação sua no banco.
        conta.setTitular("Leonardo");

        em2.persist(conta);
        /*
         * Erro da linha acima, mais se trocar para em2.merge(conta) funciona.
         * 
         * Pois o merge() é responsável por transformar uma conta que já foi gerenciada
         * pelo JPA em um momento anterior, transformando-a em Managed novamente,
         * permitindo a sincronização com o banco de dados
         */
        System.out.println(conta.getTitular());

        em2.getTransaction().commit();
        em2.close();

Boa noite Patricia, sim, eu entendo que no codigo que voce postou o objeto conta ja foi uma vez MANAGED e por isso ele é detached. Mas isso acontece pq voce usou o metodo find() passando como parametro o id da conta certo? por isso ela virou MANAGED la em cima e qdo voce encerrou o EM virou DETACHED . Mas no video NAO é isso que acontece, no video CONHECENDO O ESTADO REMOVED ele nao usa o metodo find() e sim o metodo setId() da propria classe Conta, ou seja, o objeto conta nunca teria sido gerenciado pela JPA, mas mesmo assim a excecao que eh lancada fala sobre DETACHED.. Deu pra entender ou ficou meio confuso?

Pra ajudar, tempo do video 1min00, da uma olhada no codigo e na excecao lancada nesse tempo do video.

Bom dia Joao, se você ver esse video 00min5, na linha 15 vai ver que foi feito a busca pela conta e não setado.

Linha 15 esta assim:

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

eu entendo... mas a minha duvida eh no codigo aos 1 minuto de video. Pq naquele codigo o objeto conta foi setado com o metodo setter, e mesmo assim a excecao lancada falava sobre detached.