Sobes.tech
Middle

Mik az entitások állapotai a Hibernate-ben?

sobes.tech MI

Válasz az MI-től

A Hibernate-ben egy entitás az alábbi állapotok egyikében lehet:

  • Átmeneti (Transient): A objektum létre lett hozva, de nincs hozzárendelve Hibernate munkamenethez. Nincs reprezentációja az adatbázisban. A rajta végzett műveletek memóriában történnek, de nem befolyásolják az adatbázist.

    // A Student entitás létrehozva, de nincs hozzárendelve munkamenethez
    Student student = new Student("Ivan", "Ivanov");
    
  • Állandó (Persistent): Az objektum a jelenlegi Hibernate munkamenethez van társítva, és az által kezelt. Bármilyen változtatás az objektumon szinkronizálódik az adatbázissal a tranzakció commitja vagy a munkamenet flush-e során. Egy, a munkamenet segítségével az adatbázisból olvasott objektum ebben az állapotban van.

    // A Student entitás az adatbázisból lett lekérve vagy ott tárolva
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    
    Student student = new Student("Petr", "Petrov");
    session.save(student); // a student most Persistent állapotban van
    
    // Vagy
    // Student student = session.get(Student.class, 1L); // a student Persistent állapotban van
    
    session.getTransaction().commit();
    session.close();
    
  • Leválasztott (Detached): Az objektum korábban társítva volt egy munkamenethez, de a munkamenet bezárult vagy az objektumot kifejezetten leválasztották (pl. session.evict(object) segítségével). Az objektum még mindig tartalmaz adatokat az adatbázisból, de a rajta végzett változtatások nem szinkronizálódnak automatikusan az adatbázissal. A változtatások mentéséhez az objektumot újra társítani kell egy másik munkamenethez.

    Session session1 = sessionFactory.openSession();
    session1.beginTransaction();
    
    Student student = session1.get(Student.class, 1L); // Persistent
    session1.getTransaction().commit();
    session1.close(); // a student most Leválasztott állapotban van
    
    // A leválasztott állapotban lévő objektum módosítása nem befolyásolja az adatbázist
    student.setName("New Name"); 
    
    // A változtatások mentéséhez új munkamenethez kell társítani
    Session session2 = sessionFactory.openSession();
    session2.beginTransaction();
    session2.update(student); // a student újra Persistent lesz
    session2.getTransaction().commit();
    session2.close();
    

Állapotok közötti átmenetek:

Az állapotból\Az állapotba Transient Persistent Detached
Transient (marad) save(), persist(), saveOrUpdate() (nem közvetlenül lehetséges)
Persistent (lehetetlen) (marad) close(), evict(), clear()
Detached (lehetetlen) update(), merge(), saveOrUpdate() (marad)