1
resposta

Estado do objeto Conta


        Conta conta = new Conta();
        conta.setId(2L);

        Cliente cliente = new Cliente();
        cliente.setNome("João");
        cliente.setEndereco("Meu endereço");
        cliente.setProfissao("Desenvolvedor Java");
        cliente.setConta(conta); 

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Contas");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();

        em.persist(cliente);

        em.getTransaction().commit();

Ao dar id=2 para o objeto Conta me surgiu uma dúvida. Qual o estado do objeto Conta ?? Detached (já que tem id setado) ou Transient ?

1 resposta

A diferença entre o estado Transient e o Detached não é determinada pela própria entidade. Dada uma instância de entidade, nem sempre é possível ter 100% de certeza se ela é Transient ou Detached . A diferença é apenas lógica - a instância da entidade é Detached por definição quando foi anexada anteriormente a um contexto de persistência. Isso também significa que há um registro correspondente no banco de dados.

Por outro lado, a entidade sem um ID ainda não foi persistida (anexada), portanto, ainda deve ser Transient. Esta é a única situação, quando você pode ter certeza sobre o estado. Como a entidade Detached corresponde a um registro no banco de dados e, como o id é obrigatório para entidades persistentes na JPA, a entidade Detached deve ter um ID (atribuído no seu código ou atribuído automaticamente pelo provedor JPA).

A característica Transient é NUNCA ter sido gerenciada pelo banco.