Sobes.tech
Middle

Ποια είναι τα καταστάσεις των οντοτήτων στο Hibernate;

sobes.tech AI

Απάντηση από AI

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 bazaya 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. Ob'ekt üzərində hər hansı dəyişiklik, əməliyyatın təsdiqlənməsi və ya sessiyanın flush edilməsi zamanı bazaya sinxronlaşdırılır. Sessiya vasitəsilə bazadan oxunan obyekt bu vəziyyətdədir.

    // Student varlığı bazadan 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 Dəqiq vəziyyətdədir
    
    // və ya
    // Student student = session.get(Student.class, 1L); // student Dəqiq vəziyyətdədir
    
    session.getTransaction().commit();
    session.close();
    
  • Ayrılmış (Detached): Ob'ekt əvvəlki sessiya ilə əlaqəli olub, lakin sessiya bağlanıb və ya obyekt açıq şəkildə ayrılıb (məsələn, session.evict(object) istifadə edilərək). Obyekt hələ də bazadan məlumatları ehtiva edir, lakin üzərində edilən dəyişikliklər avtomatik olaraq bazaya 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); // Dəqiq
    session1.getTransaction().commit();
    session1.close(); // student indi Ayrılmış vəziyyətdədir
    
    // Ayrılmış vəziyyətdə olan obyekt üzərində edilən dəyişikliklər bazanı 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 Dəqiq 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)