Sobes.tech
Middle

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)