Sobes.tech
Middle

Wat zijn de toestanden van entiteiten in Hibernate?

sobes.tech AI

Antwoord van AI

In Hibernate kan een entiteit zich in een van de volgende staten bevinden:

  • Transient (Tijdelijk): Het object is gemaakt, maar niet gekoppeld aan een Hibernate-sessie. Het heeft geen representatie in de database. Operaties op het worden in het geheugen uitgevoerd, maar beïnvloeden de database niet.

    // De entiteit Student is gemaakt, maar niet gekoppeld aan een sessie
    Student student = new Student("Ivan", "Ivanov");
    
  • Persistent (Persistent): Het object is gekoppeld aan de huidige Hibernate-sessie en wordt door deze beheerd. Elke wijziging aan het object wordt gesynchroniseerd met de database bij het committen van de transactie of het flushen van de sessie. Een uit de database gelezen object bevindt zich in deze staat.

    // De entiteit Student is uit de database gehaald of daarin opgeslagen
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    
    Student student = new Student("Petr", "Petrov");
    session.save(student); // student is nu in Persistent-stand
    
    // Of
    // Student student = session.get(Student.class, 1L); // student in Persistent-stand
    
    session.getTransaction().commit();
    session.close();
    
  • Detached (Losgekoppeld): Het object was eerder gekoppeld aan een sessie, maar de sessie is gesloten of het object is expliciet losgekoppeld (bijvoorbeeld met session.evict(object)). Het object bevat nog steeds gegevens uit de database, maar wijzigingen die erin worden aangebracht, worden niet automatisch gesynchroniseerd met de database. Om wijzigingen op te slaan, moet het object opnieuw worden gekoppeld aan een andere sessie.

    Session session1 = sessionFactory.openSession();
    session1.beginTransaction();
    
    Student student = session1.get(Student.class, 1L); // Persistent
    session1.getTransaction().commit();
    session1.close(); // student is nu Detached
    
    // Wijzigingen aan het object in Detached-stand beïnvloeden de database niet
    student.setName("New Name"); 
    
    // Om de wijzigingen op te slaan, moet het opnieuw worden gekoppeld aan een nieuwe sessie
    Session session2 = sessionFactory.openSession();
    session2.beginTransaction();
    session2.update(student); // student wordt weer Persistent
    session2.getTransaction().commit();
    session2.close();
    

Overgangen tussen staten:

Van toestand\Naar toestand Transient Persistent Detached
Transient (blijft) save(), persist(), saveOrUpdate() (niet direct mogelijk)
Persistent (onmogelijk) (blijft) close(), evict(), clear()
Detached (onmogelijk) update(), merge(), saveOrUpdate() (blijft)