Sobes.tech
Middle
493

Hibernate-деги объекттердин абалы кандай?

AIден жооп

sobes.tech AI

Hibernate ичинде объект төмөнкү абалда болушу мүмкүн:

  • Transient (Өткөөл): Объект түзүлгөн, бирок Hibernate сессиясына байланышпаган. Базада көрсөтүүсү жок. Ага карата операциялар эс тутумда жүргүзүлөт, бирок базага таасир этпейт.

    // Student объекти түзүлдү, бирок сессияга байланбады
    Student student = new Student("Ivan", "Ivanov");
    
  • Persistent (Туруктуу): Объект учурдагы Hibernate сессиясына байланыштуу жана аны менен башкарылат. Ар кандай өзгөртүүлөр транзакцияны ырастоо же сессияны тазалоо (flush) учурунда базада жаңыртылат. Сессия аркылуу алынган объект ушул абалда болот.

    // 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() (калат)