Sobes.tech
Middle

Ինչ են Hibernate-ի մեջ առարկաների վիճակները։

sobes.tech AI

Պատասխան AI-ից

Hibernate-ում էություն կարող է գտնվել հետևյալ վիճակներից մեկում.

  • Transient (Տրանսիենտ): Օբյեկտը ստեղծված է, բայց չի կապված Hibernate սեսիայի հետ: Չունի տվյալների բազայում ներկայացում: Գործողությունները նրա հետ կատարվում են հիշողության մեջ, բայց չեն ազդում տվյալների բազայի վրա:

    // Student էությունը ստեղծված է, բայց չի կապված սեսիայի հետ
    Student student = new Student("Ivan", "Ivanov");
    
  • Persistent (Հաստատուն): Օբյեկտը կապված է ընթացիկ Hibernate սեսիայի հետ և կառավարվում է նրա կողմից: Յուրաքանչյուր փոփոխություն, որը կատարվում է օբյեկտի վրա, սինխրոնիզացվում է տվյալների բազայի հետ՝ տրանզակցիայի հաստատում կամ սեսիայի մաքրման ժամանակ:

    // Student էությունը բազայից է վերցված կամ այնտեղ պահվում է
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    
    Student student = new Student("Petr", "Petrov");
    session.save(student); // student այժմ Persistent վիճակում
    
    // կամ
    // Student student = session.get(Student.class, 1L); // student Persistent վիճակում
    
    session.getTransaction().commit();
    session.close();
    
  • Detached (Ներդրված չէ): Օբյեկտը նախկինում կապված էր սեսիայի հետ, բայց սեսիան փակվել է կամ օբյեկտը հստակորեն հեռացվել է (session.evict(object)). Օբյեկտը դեռ պարունակում է տվյալներ, բայց փոփոխությունները չեն ավտոմատ կերպով սինխրոնիզացվում տվյալների բազայի հետ: Փոփոխությունները պահպանելու համար անհրաժեշտ է այն կրկին միացնել այլ սեսիայի հետ:

    Session session1 = sessionFactory.openSession();
    session1.beginTransaction();
    
    Student student = session1.get(Student.class, 1L); // Persistent
    session1.getTransaction().commit();
    session1.close(); // student այժմ Detached վիճակում
    
    // Փոփոխությունը Detached վիճակում չի ազդի բազայի վրա
    student.setName("Նոր անուն"); 
    
    // Փոփոխությունները պահպանելու համար այն պետք է կրկին միացնել նոր սեսիայի հետ
    Session session2 = sessionFactory.openSession();
    session2.beginTransaction();
    session2.update(student); // student կրկին Persistent
    session2.getTransaction().commit();
    session2.close();
    

Մուտքեր միջև վիճակների:

Վիճակից\Մուտք Transient Persistent Detached
Transient (մնում է) save(), persist(), saveOrUpdate() (ուղիղ հնարավոր չէ)
Persistent (ուղիղ հնարավոր չէ) (մնում է) close(), evict(), clear()
Detached (ուղիղ հնարավոր չէ) update(), merge(), saveOrUpdate() (մնում է)