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!