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

Dúvida sobre Detached

Fiquei com uma duvida sobre o estado Detached.

Vamos supor que eu tenha o método que atualize a conta de um cliente, vou escreve o código abaixo somente para ilustrar a dúvida:

public class TesteBuscaConta {

    public static void main(String[] args) {


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

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

        conta.setTitular("Gabriel");

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

        em.getTransaction().commit();
        em.close();

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

        conta.setTitular("Antonio");
        em2.merge(conta);

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


    }

}

Na linha:

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

Como a persistencia sabe que é pra buscar o 1 na coluna id? E se eu quisesse fazer a buscar por nome por exemplo, como ficaria?

No trecho :

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

        conta.setTitular("Antonio");
        em2.merge(conta);

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

O primeiro EntityManager (em) foi fechado, e o find pra buscar a linha a ser alterada morreu certo? Como o em2 sabe que tem que alterar aquela linha se não houve um find para dizer qual a linha a ser alterada? Pois pelo que entendi o em2 não tem relação nenhuma com o em1... Como merge vai saber em qual linha ele vai ter que alterar o titular? Ou seja se fosse um update na mão, você usaria um where com o resultSet (que no caso do hibernate é o resultado do se find que o deixa em estado managed) para fazer o update.

Obrigado!

2 respostas
solução!

bom dia Marco, na verdade o find() é uma método já pronto da JPA que sempre irá buscar um registro pelo ID, então você deve sempre passar o id. Agora se você quiser fazer uma busca por alguma outra coluna da tabela tem que usar a instrução createQuery().

Quando você fechou o em, sua conta que antes estava managed virou detached por a JPA não está mais olhando pra ela, então se tentar alterar algo na conta terá esse erro. Por isso deveria fazer o find() novamente para buscar a conta e torna-la managed ou o merge que transforma uma conta detached em managed.

Ficou claro pra ti ?

Bom dia, sim ficou claro, ainda não terminei o curso e não vi o uso do createQuery(), é provavel que tenha la. Obrigado!