ORM Nedir?
13 January 2016
Rest Servis Best Practises
14 April 2016

Hibernate @LAZY Loading Nedir?

Hibernate @LAZY Loading Nedir?

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 kurulmalıdır. Bu ilişkinin kurulması ORM dünyasında oldukça keyifli ve sistematiktir.

Motivasyon nesnelere erişim, 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 entityleri 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.

Size bir sır vereyim mi?

Hibernate, nesne davranışlarına bu anotasyonlar ve tanımlamalar ile karar vermez. Bu anotasyonlarla ile biz developerlar, Hibernate’e nasıl davranacağını söyleriz. 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.

Hibernat’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ı yönünden bakar.

Yukarıdaki görselde 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 Akalın
Alper Akalın
Java Programmer || Software Architect || Author || Speaker

Leave a Reply

Your email address will not be published. Required fields are marked *