Sobes.tech
Middle

Millised on entiteetide seisundid Hibernate'is?

sobes.tech AI

Vastus AI-lt

Hibernate'is võib olek olla üks järgmistest:

  • Transient (Ülemineku): Objekt on loodud, kuid ei ole seotud Hibernate'i sessiooniga. Sellel ei ole andmebaasis esindatust. Tegevused sellel toimuvad mälus, kuid ei mõjuta andmebaasi.

    // Student-objekt on loodud, kuid ei ole seotud sessiooniga
    Student student = new Student("Ivan", "Ivanov");
    
  • Persistent (Püsiv): Objekt on seotud praeguse Hibernate sessiooniga ja seda hallatakse. Igasugused muudatused objekti sees sünkroniseeritakse andmebaasiga, kui kinnitatakse transaktsioon või tühjendatakse (flush) sessioon. Objekt, mis on sessiooni kaudu andmebaasist loetud, on selles olekus.

    // Student-objekt on saadud andmebaasist või salvestatud sinna
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    
    Student student = new Student("Petr", "Petrov");
    session.save(student); // student on nüüd püsivas olekus
    
    // Või
    // Student student = session.get(Student.class, 1L); // student on püsivas olekus
    
    session.getTransaction().commit();
    session.close();
    
  • Detached (Eraldatud): Objekt oli varem seotud sessiooniga, kuid sessioon on suletud või objekt on selgelt eraldatud (näiteks session.evict(object) abil). Objekti andmed sisaldavad endiselt andmebaasi andmeid, kuid tehtud muudatused ei ole automaatselt sünkroniseeritud. Muudatuste salvestamiseks tuleb objekt uuesti ühendada teise sessiooniga.

    Session session1 = sessionFactory.openSession();
    session1.beginTransaction();
    
    Student student = session1.get(Student.class, 1L); // Püsiv
    session1.getTransaction().commit();
    session1.close(); // student on nüüd Detached
    
    // Muudatused Detached olekus ei mõjuta andmebaasi
    student.setName("Uus nimi"); 
    
    // Muudatuste salvestamiseks tuleb see uuesti ühendada uue sessiooniga
    Session session2 = sessionFactory.openSession();
    session2.beginTransaction();
    session2.update(student); // student on taas Püsiv
    session2.getTransaction().commit();
    session2.close();
    

Liikumine olekute vahel:

Olekust\Olekusse Transient Persistent Detached
Transient (jääb) save(), persist(), saveOrUpdate() (otseselt ei ole võimalik)
Persistent (võimalik) (jääb) close(), evict(), clear()
Detached (võimalik) update(), merge(), saveOrUpdate() (jääb)