Quels sont les états des entités dans Hibernate?
sobes.tech IA
Réponse de l'IA
En Hibernate, une entité peut se trouver dans l'un des états suivants :
-
Transitoire : L'objet a été créé, mais n'est pas associé à une session Hibernate. Il n'a pas de représentation dans la base de données. Les opérations sur lui sont effectuées en mémoire, mais n'affectent pas la base de données.
// L'entité Student a été créée, mais n'est pas liée à une session Student student = new Student("Ivan", "Ivanov"); -
Persistent : L'objet est associé à la session Hibernate en cours et est géré par elle. Toute modification de l'objet sera synchronisée avec la base de données lors du commit de la transaction ou du flush de la session. Un objet lu de la base de données via une session est dans cet état.
// L'entité Student a été récupérée de la base ou sauvegardée dedans Session session = sessionFactory.openSession(); session.beginTransaction(); Student student = new Student("Petr", "Petrov"); session.save(student); // student est maintenant en état Persistent // Ou // Student student = session.get(Student.class, 1L); // student en état Persistent session.getTransaction().commit(); session.close(); -
Détaché : L'objet a été associé précédemment à une session, mais la session a été fermée ou l'objet a été explicitement détaché (par exemple, avec
session.evict(object)). L'objet contient encore des données de la base, mais les modifications apportées ne seront pas automatiquement synchronisées avec la base. Pour sauvegarder les modifications, il faut réattacher l'objet à une autre session.Session session1 = sessionFactory.openSession(); session1.beginTransaction(); Student student = session1.get(Student.class, 1L); // Persistent session1.getTransaction().commit(); session1.close(); // student est maintenant en état Détaché // Modifier l'objet en état Détaché n'affecte pas la base student.setName("New Name"); // Pour sauvegarder les modifications, il faut le réattacher à une nouvelle session Session session2 = sessionFactory.openSession(); session2.beginTransaction(); session2.update(student); // student redevient Persistent session2.getTransaction().commit(); session2.close();
Transitions entre états :
| De l'état\À l'état | Transitoire | Persistent | Détaché |
|---|---|---|---|
| Transitoire | (reste) | save(), persist(), saveOrUpdate() |
(pas directement possible) |
| Persistent | (impossible) | (reste) | close(), evict(), clear() |
| Détaché | (impossible) | update(), merge(), saveOrUpdate() |
(reste) |