JavaRush /Kurslar /All lectures for UZ purposes /Hibernate Entity-ob'yektlarning Hayotiy Tsikli

Hibernate Entity-ob'yektlarning Hayotiy Tsikli

All lectures for UZ purposes
Daraja, Dars
Mavjud

Holatlar ro'yxati

Endi eng qiziq qismi boshlanadi. Entity-ob'yektlarning holatlarini o'rganamiz. Hammasi uchun haq to'lanadi va Hibernate'ni ishlatish ham shunday. HQL o'rganish - bu qadar to'lov deb o'ylamagan bo'lsangiz kerak, to'g'rimi? Yo'q, hayot biroz murakkabroq tuzilgan.

Agar sizda Hibernate yordamida bazaga saqlashingiz mumkin bo'lgan biror Entity-ob'yekt bo'lsa, Hibernate nuqtai nazaridan bu ob'ektning to'rt xil holati bo'lishi mumkin:

  • Transient
  • Persistent (yoki Managed)
  • Detached
  • Removed

Sizni qiziqtirish uchun, ushbu ma'ruzaga mana bunday rasm qo'shaman:

Transient

Aslida hammasi ko'rinadiganidan osonroq, lekin ba'zi nuanslar bilan. Masalan, har bir Entity ob'ekt siz Java-kod yordamida ochiqchasiga yaratganingizda va Hibernate orqali bazadan yuklamaganingizda Transient (aniq bo'lmagan) holatiga ega.


EmployeeEntity employee = new EmployeeEntity();

Transient holati shuni anglatadiki, Hibernate bu ob'ekt haqida tushunchaga ega emas va ob'ekt bilan hech qanday harakatlar Hibernate ga ta'sir qilmaydi, xuddi Hibernate'ning ishi bu ob'ektga ta'sir qilmaydi.

Bunday ob'ektlar yana POJO – Oddiy Eski Java Ob'ekt deb ham ataladi. Bu atama ko'pincha turli xil hiyla-nayrangli xatti-harakatlarga ega ob'ektlarga qarama-qarshi sifatida ishlatiladi. Mockito yaratgan Moc-ob'ektlar esingizdami? Ular POJO emas.

Agar biror mijoz kodi Transient holatida ob'ekt bilan ishlayotgan bo'lsa, ularning o'zaro ta'siri super-sodda sxemasi bilan ifodalanishi mumkin:

Persistent yoki Managed

Keyingi eng keng tarqalgan holat – bu Hibernate dvigateliga bog'langan ob'ektlar. Ularning holati Persistent (yoki Managed) deb ataladi. Bunday holatga ega ob'ektni olishning aniq ikki yo'li mavjud:

  • Ob'ektni Hibernate dan yuklang.
  • Ob'ektni Hibernate ga saqlang.

Misollar:


Employee employee = session.load(Employee.class, 1);

Employee employee = new Employee ();
session.save(employee);

Bunday ob'ekt odatda ma'lumotlar bazasida ba'zi bir yozuvga mos keladi, ID va shu kabi narsalarga ega bo'ladi. Bu ob'ekt Hibernate sessiyasiga bog'langan va odatda haqiqiy ob'ekt emas, balki ba'zi proxy tomonidan taqdim etilishi mumkin.

Juda real vaziyat bo'lishi mumkin, agar session.load() metodini chaqirgandan so'ng, sizga haqiqiy ob'ekt o'rniga biror to'xtash ob'ekti (proxy) berilsa va ma'lumotlar bazasiga murojaatlar faqat ushbu ob'ektning metodlarini chaqirganda amalga oshiriladi. Lekin bunday tafsilotlarni keyinroq gaplashamiz.

Va Managed holatidagi ob'ekt va mijoz kodi o'zaro ta'sirini quyidagi rasmda ifodalash mumkin:

Detached

Keyingi holat - bu ob'ekt sessiyadan uzilganida yuzaga keladi. Ya'ni, qachondir ob'ekt Hibernate sessiyasiga bog'langan edi, lekin keyinchalik sessiya yopildi yoki tranzaksiya tugatildi va Hibernate bu ob'ektni nazorat qilmaydi.

Misol:


session.close();

session.evict(entity);

Birinchi misolda sessiya yopildi. Ikkinchi holatda biz ob'ektni sessiyadan uzishni evict() metodi yordamida ochiqchasiga ko'rsatdik.

Kod va ob'ektning o'zaro ta'siri yangi sxemasi quyidagicha ko'rinadi:

Va endi eng qiziqarli narsa shu. Agar sizning ob'ektingiz Hibernate'dan olingan bo'lsa, sizga haqiqiy ob'ekt o'rniga ba'zi proxy berilgan bo'lish ehtimoli katta. Va bu proxy-ob'ekt sessiyadan uzilgandan so'ng, uning metodlarini chaqirganda istisnolarni o'rtaga tashlaydi.

Bu Hibernate bilan ishlashda yangi boshlovchilar uchun eng keng tarqalgan muammo. Entity-ob'ekt bilan ishlayotganingizda, har bir vaqt nuqtasi uchun quyidagi savollarga to'g'ri javob berishingiz kerak:

  • Sizda haqiqiy ob'ekt bormi yoki shunchaki haqiqiy ob'ektdan proxy bormi?
  • Hozir tranzaksiyadamisiz yoki yo'qmi?
  • Bu read-write tranzaksiya yoki read-only tranzaksiya?
  • Ob'yekt LazyLoading mexanizmi bilan boshqariladimi?
  • Ob'yektning qaysi qismlari allaqachon xotiraga yuklangan va qaysi biri murojaat qilinganda yuklanadi?
  • Ob'yekt qanday qilib boshqa ob'ektlar bilan bog'langan?

Yaxshi yangilik - ko'p holatlarda hammasi aniq. Lekin baribir hamma narsaning qanday ishlashini tushunish kerak. Deklarativ dasturlash ana shunday – kodni 10 daqiqada yozishingiz mumkin, lekin u kerakli tarzda ishlamasligini tushunish uchun 10 soat ketishi mumkin :)

Removed

Va Entity-ob'ektingizning so'nggi holati - bu Removed. Ehtimol, uning nomi orqali tushunganingizdek, bu holat o'chirilgan ob'ekt holati.

Bu holat shuning uchun paydo bo'ladi, agar siz biror ob'ektni bazadan o'chirsangiz, Java-ob'ekt darhol yo'qolmaydi.


Employee employee = session.load(Employee.class, 1);
//yuklashdan so'ng ob'ekt holati Persisted 
 
session.remove(employee);
//o'chirilgandan so'ng ob'ekt holati Removed  
 
session.save(employee);
//endi yana Persisted 
 
session.close();
//endi holat Detached
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION