JavaRush /Kurslar /All lectures for UZ purposes /Objektni Hibernate'da qanday saqlash kerak

Objektni Hibernate'da qanday saqlash kerak

All lectures for UZ purposes
Daraja, Dars
Mavjud

Objekt statusining imkoniyatli variantlari

Belgilab qo'yganingdek, agar objekt Hibernate bilan bog'langan bo'lsa, uning holati Persistent yoki Managed deb ataladi. Qanday to'g'ri? Persist yoki Managed?

Ikkalasi ham to'g'ri. JPA spesifikatsiyasiga ko'ra, objektga Persist statusi beriladi, Hibernate spesifikatsiyasiga ko'ra esa uning holati Managed deb ataladi.

Hibernate'da baza bilan ishlash org.hibernate.Session turidagi objekt orqali olib boriladi. JPA esa klassni javax.persistence.EntityManager deb nomlanishini talab qiladi. Bu yerda katta muammo yo'q, chunki ikkala tur ham interfeys hisoblanadi.

org.hibernate.Session interfeysi quyidagicha e'lon qilingan:


interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
 
}

Shu sababli Session interfeysida EntityManager interfeysida mavjud barcha metodlar mavjud. Lekin o'ziga xos metodlari ham bor, ularni JPA spesifikatsiyasi mavjud bo'lmagan eski Hibernate versiyalaridan olgan.

Bu vaziyat quyidagi rasmda tasvirlangan:

Session interfeysida mavjud barcha metodlarni va ularning ishlash xususiyatlarini ko'rib chiqamiz.

persist() metodining xususiyatlari

Objektni ma'lumotlar bazasida saqlashda ikki narsani yodda tutish kerak.

Birinchidan, objektni saqlash oxir-oqibat SQL komandasi: INSERT yoki UPDATE ni bajarilishiga olib keladi. Ikkinchidan, bu harakatlar session objekti metodini chaqirishdan so'ng darhol emas, balki tranzaksiya yopilgandan so'ng sodir bo'ladi.

Sodda vaziyatni ko'rib chiqamiz, masalan, sizda User klassi mavjud:


@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;
 
	@Columnt(name=”user_name”)
    public String name;
}

Uning obyektini persist() metodi orqali saqlaymiz.


User user = new User();
user.setName("Kolyan");
session.persist(user);

Ushbu metodning vazifasi yangi obyektni ma'lumotlar bazasida saqlashdir. Agar bunday obyekt hali mavjud bo'lmasa, u SQL INSERT metodi orqali bazaga qo'shiladi.

Agar obyekt allaqachon bazada mavjud bo'lsa, hech narsa sodir bo'lmaydi. Biroq, uchinchi holat bo'lishi mumkin – Detached statusida bo'lgan obyektni bazaga saqlab olishga urinish. Bu holatda istisno tashlanadi. Misol:


// Obyekt yaratilyapti va saqlanyapti
User user = new User();
user.setName("Kolyan");
session.persist(user);
 
session.evict(user);     // sessiyadan obyektni ajratamiz
session.persist(user);   // bu yerda PersistenceException tashlanadi!

save() metodining xususiyatlari

save() metodi hozirgi Hibernate'ga uning oldingi versiyalaridan keldi. Asosan, u persist() metodiga juda o'xshaydi, chunki u ham INSERT metodi yordamida jadvalga yangi yozuv qo'shadi. Ammo uning bir nechta qiziqarli xususiyatlari bor.

Birinchidan, bu metod qiymat qaytaradi – obyektning yangi ID qiymati. Avval bilib olganingizdek, obyektlar bazaga qo'shilishidan oldin ID ga ega emas va u ma'lumotlar bazasi tomonidan tayinlanadi. Shunday qilib, save() metodi session obyektining saqlanayotgan obyektiga tayinlangan ID ni qaytaradi.

Muhim! Hibernate spesifikatsiyasiga ko'ra, ID har qanday serializable obyekt bo'lishi mumkin, nafaqat raqam. Bu string, raqam, enum yoki bazadagi jadvalning bir ustuniga butunlay qo'yilishi mumkin bo'lgan har qanday narsa bo'lishi mumkin.

save() metodi Serialized turidagi natijaga ega, shuning uchun uning natijasini to'g'ri turga aylantirish kerak:


// Obyekt yaratilyapti va saqlanyapti
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

Shuningdek, save() metodi Detached obyekt holatiga nisbatan boshqacha xatti-harakatlarga ega. Bunday obyektni u yangi deb hisoblaydi va shunchaki yana bir yozuv qo'shadi:


// Obyekt yaratilyapti, saqlanyapti va qayta saqlanyapti
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
 
session.evict(user); 	// sessiyadan obyektni ajratamiz
Integer id2 = (Integer) session.save(user);

id va id2 o'zgaruvchilari farq qiladi. Ma'lumotlar bazasidagi jadvalga ikkita yozuv qo'shiladi: har bir save() operatsiyasi uchun bittadan.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION