Sobes.tech
Middle

Aké sú stavy entít v Hibernate?

sobes.tech AI

Odpoveď od AI

V Hibernate entita môže byť v jednom z nasledujúcich stavov:

  • Transient (Prechodný): Objekt je vytvorený, ale nie je spojený s Hibernate session. Nemá žiadne zobrazenie v databáze. Operácie s ním sa vykonávajú v pamäti, ale neovplyvňujú databázu.

    // Entita Student je vytvorená, ale nie je priradená k session
    Student student = new Student("Ivan", "Ivanov");
    
  • Persistent (Stále): Objekt je spojený s aktuálnou Hibernate session a je ňou spravovaný. Akékoľvek zmeny objektu budú synchronizované s databázou pri potvrdení transakcie alebo vyprázdnení (flush) session. Objekt načítaný z databázy pomocou session je v tomto stave.

    // Entita Student je načítaná z databázy alebo uložená v nej
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    
    Student student = new Student("Petr", "Petrov");
    session.save(student); // student je teraz v Persistent stave
    
    // Alebo
    // Student student = session.get(Student.class, 1L); // student je v Persistent stave
    
    session.getTransaction().commit();
    session.close();
    
  • Detached (Odpojené): Objekt bol skôr spojený so session, ale session bola zatvorená alebo bol objekt výslovne odpojený (napríklad pomocou session.evict(object)). Objekt stále obsahuje údaje z databázy, ale zmeny v ňom vykonané nebudú automaticky synchronizované s databázou. Aby bolo možné zmeny uložiť, je potrebné objekt znova pripojiť k inej session.

    Session session1 = sessionFactory.openSession();
    session1.beginTransaction();
    
    Student student = session1.get(Student.class, 1L); // Persistent
    session1.getTransaction().commit();
    session1.close(); // student je teraz v Detached stave
    
    // Zmena objektu v Detached stave neovplyvní databázu
    student.setName("Nové meno"); 
    
    // Na uloženie zmien je potrebné ho pripojiť k novej session
    Session session2 = sessionFactory.openSession();
    session2.beginTransaction();
    session2.update(student); // student je znova v Persistent stave
    session2.getTransaction().commit();
    session2.close();
    

Prechody medzi stavmi:

Z stavu\Do stavu Transient Persistent Detached
Transient (zostáva) save(), persist(), saveOrUpdate() (nepoužiteľné priamo)
Persistent (nepoužiteľné) (zostáva) close(), evict(), clear()
Detached (nepoužiteľné) update(), merge(), saveOrUpdate() (zostáva)