Sobes.tech
Middle

Hibernate-də varlıqların vəziyyətləri nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Hibernate-də, varlıq aşağıdakı vəziyyətlərdən birində ola bilər:

  • Keçici (Transient): Obyekt yaradılıb, lakin Hibernate sessiyası ilə əlaqələndirilməyib. Verilənlər bazasında təmsilatı yoxdur. Üzərində əməliyyatlar yaddaşda həyata keçirilir, lakin verilənlər bazasına təsir etmir.

    // Student varlığı yaradılıb, lakin sessiyaya bağlı deyil
    Student student = new Student("Ivan", "Ivanov");
    
  • Daimi (Persistent): Obyekt mövcud Hibernate sessiyası ilə əlaqəlidir və onun tərəfindən idarə olunur. Obyektdəki hər hansı dəyişiklik, əməliyyatın təsdiqlənməsi və ya sessiyanın flush edilməsi zamanı verilənlər bazası ilə sinxronlaşdırılır. Sessiya vasitəsilə verilənlər bazasından oxunan obyekt bu vəziyyətdədir.

    // Student varlığı verilənlər bazasından alınmış və ya orada saxlanılmışdır
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    
    Student student = new Student("Petr", "Petrov");
    session.save(student); // student indi Daimi vəziyyətdədir
    
    // və ya
    // Student student = session.get(Student.class, 1L); // student Daimi vəziyyətdə
    
    session.getTransaction().commit();
    session.close();
    
  • Ayırılmış (Detached): Obyekt əvvəlki sessiya ilə əlaqəli olub, lakin sessiya bağlanıb və ya obyekt açıq şəkildə ayırılıb (məsələn, session.evict(object) istifadə edilərək). Obyekt hələ də verilənlər bazası məlumatlarını ehtiva edir, lakin üzərində edilən dəyişikliklər avtomatik olaraq verilənlər bazasına sinxronlaşdırılmayacaq. Dəyişiklikləri saxlamaq üçün obyekt yenidən başqa sessiyaya qoşulmalıdır.

    Session session1 = sessionFactory.openSession();
    session1.beginTransaction();
    
    Student student = session1.get(Student.class, 1L); // Daimi
    session1.getTransaction().commit();
    session1.close(); // student indi Ayırılmış vəziyyətdədir
    
    // Ayırılmış vəziyyətdə olan obyekt üzərində edilən dəyişikliklər verilənlər bazasını təsir etmir
    student.setName("New Name"); 
    
    // Dəyişiklikləri saxlamaq üçün onu yeni sessiyaya yenidən qoşmaq lazımdır
    Session session2 = sessionFactory.openSession();
    session2.beginTransaction();
    session2.update(student); // student yenidən Daimi olur
    session2.getTransaction().commit();
    session2.close();
    

Vəziyyətlər arasındakı keçidlər:

Vəziyyətdən\Vəziyyətə Transient Persistent Detached
Transient (qalır) save(), persist(), saveOrUpdate() (birbaşa mümkün deyil)
Persistent (mümkün deyil) (qalır) close(), evict(), clear()
Detached (mümkün deyil) update(), merge(), saveOrUpdate() (qalır)