Hibernate Lazy Loading
@LAZY Loading
ORM metodolojide veritabanı tabloları, java entityler ile eşleştirilmekte. Böylece tablo nesne ilişkisi kurulmaktadır. Bunların yanında tablolar arasında kurulan ilişkiler, tablolar arası ilişkiyi desteklecek şekilde nesneler arasında da kurulmaktadır. Bu ilişkinin kurulması ORM dünyasında oldukça keyifli ve sistematiktir.
Motivasyon, nesnelere erişim, yani READ aşamasında aşağı doğru bir eğim göstermektedir. Nesneler arası ilişkilerin motivasyon başlangıç noktası ise bu nesnelere erişimin nasıl olacağı yönündedir. Bu noktada tasarım ne kadar iyiyse motivasyon da o kadar iyidir.
Lazy Loading
Bir senaryo üzerinden konuşalım. Elimde customer entity ve customer ile ilişkili address etityleri olsun. Projemin herhangi bir yerinde customer tablosuna ait bilgileri istediğimde address bilgilerinin gelmemesini istiyorum. Ya da belirli koşullar altında address bilgilerini görüntülemek istiyorum. Bu durumda kullandığımız yapının adı lazy loadingdir. Yani asıl nesne, entity çağrısı yapıldığında ilişkili nesnenin gelmemesi durumu.
Eager Loading
Yukarıdaki senaryoda, asıl nesneye yaptığım her görüntüleme çağrısında ilişkili tüm entitylere ait bilgilerin görüntülenmesi durumu.
Hibernate ile nesne erişimleri yönetimi bu iki başlık altında ele alınmaktadır. Nesne erişimini nasıl yönetiriz sorusuna genelede verilen cevap, Hibernate default davranışı EAGER’dir. Ancak anotasyonlar üzerinden FetchType tanımlamaları ile Hibernate’in nesne erişim davranışını, stratetijisini değiştirlebiliriz şeklindedir.. Bir şeyler eksik sanki.
- hibernate-fetchtype-eager
- hibernate-fetchtype-lazy
Size bir sır vereyim mi?
Hibernate, nesne davranışlarına bu anotasyonlar ve tanımlamalar ile karar vermez. FetchType anotasyonlarıyla ile biz developerlar Hibernate’e nasıl davranacağını söyleriz. İşte bu aşamada Hibernate’e ne yapacağını söylemeden önce onun davranışlarını iyi analiz etmeliyiz. Anotasyonu tanımladığımız yön bile çok şeyi değiştirecektir.
Hibernate bir nesneye nasıl davranacağına belirli kurallar altında kendisi karar vermektedir.
- Nesne o an nereden çağrıldı?
- Nesnenin sınıfı nedir? (first class-second class)
- Nesnenin o an ki ilişkisi nedir?
- Nesnenin o an ki durumu nedir?
Hibernate, uygulama içerisinde bu durumları inceler ve nesneye @Lazy ya da @Eager davranışlardan hangisini uygulayacağına karar verir. Bu karardan sonra verilere erişim yönü netlik kazanır.
- Nesneler arası ilişkiler ve nesnenin çağrıldığı yer, onun sınıfını belirlemektedir.
- Nesneler first class ise eager muamele görürler.
- Second class ise lazy muamele görürler.
Hibernate ‘te default gelen tanımlama budur. Nesneler daima eager muamele görmezler. Sınıflandırılırlar ve ona göre muamele görürler.
Nesnenin o andaki durumu. Literatürde, Object State denilen tanımlama. Hibernate nesnelere,
-
Transient
-
Persist
-
Detached
durumları altından bakar.
Yukarıdaki diagramda read işleminin konumu yer almaktadır. Read işlemi session içerisinde persist konumda olmalıdır. Özellikle lazy nesnelere erişimdeki session yok proxy object oluşturulamadı gibi hatalar dikkatinizi çekmiştir.
Hibernate, yazma işlemlerinde olduça başarılı işlere imza atmaktadır. Ancak okuma yani verilere erişmede işler biraz karışıyor. Read işlemleri yapılırken Hibernate nesne erişim stratejilerine yüksek seviyede hakimiyet ve özen gerekmektedir.
Alper