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) |