Sobes.tech
Middle

Quais são os estados das entidades no Hibernate?

sobes.tech IA

Resposta da IA

No Hibernate, uma entidade pode estar em um dos seguintes estados:

  • Transiente: O objeto foi criado, mas não está associado a uma sessão Hibernate. Não possui representação na base de dados. As operações sobre ele são feitas na memória, mas não afetam a base de dados.

    // A entidade Student foi criada, mas não vinculada a uma sessão
    Student student = new Student("Ivan", "Ivanov");
    
  • Persistente: O objeto está associado à sessão Hibernate atual e é gerenciado por ela. Qualquer alteração no objeto será sincronizada com a base de dados ao fazer commit na transação ou ao fazer flush na sessão. Um objeto lido da base de dados através de uma sessão está neste estado.

    // A entidade Student foi obtida da base de dados ou salva nela
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    
    Student student = new Student("Petr", "Petrov");
    session.save(student); // student agora em estado Persistente
    
    // Ou
    // Student student = session.get(Student.class, 1L); // student em estado Persistente
    
    session.getTransaction().commit();
    session.close();
    
  • Desanexado: O objeto foi associado anteriormente a uma sessão, mas a sessão foi fechada ou o objeto foi explicitamente desanexado (por exemplo, usando session.evict(object)). O objeto ainda contém dados da base de dados, mas as alterações feitas nele não serão sincronizadas automaticamente com a base de dados. Para salvar as alterações, o objeto precisa ser novamente associado a outra sessão.

    Session session1 = sessionFactory.openSession();
    session1.beginTransaction();
    
    Student student = session1.get(Student.class, 1L); // Persistente
    session1.getTransaction().commit();
    session1.close(); // student agora em estado Desanexado
    
    // Alteração do objeto em estado Desanexado não afeta a base de dados
    student.setName("New Name"); 
    
    // Para salvar as alterações, é necessário re-associar a uma nova sessão
    Session session2 = sessionFactory.openSession();
    session2.beginTransaction();
    session2.update(student); // student volta a ser Persistente
    session2.getTransaction().commit();
    session2.close();
    

Transições entre estados:

De estado\Para estado Transiente Persistente Desanexado
Transiente (permanece) save(), persist(), saveOrUpdate() (não possível diretamente)
Persistente (não possível) (permanece) close(), evict(), clear()
Desanexado (não possível) update(), merge(), saveOrUpdate() (permanece)