Devletlerin listesi

Ve şimdi eğlence başlıyor. Entity nesnelerinin durumlarını inceleyeceğiz. Her şey için ve Hazırda Bekletme modunu kullanmak için de ödeme yapmalısınız. HQL öğrenmenin çok büyük bir bedel olduğunu düşünmüyor musunuz? Hayır, hayat biraz daha karmaşık.

Hazırda Beklet'i kullanarak veritabanına kaydedebileceğiniz bir tür Entity nesneniz varsa, Hazırda Beklet'in bakış açısından bu nesnenin dört durumu olabilir:

  • Geçici
  • Kalıcı (veya Yönetilen)
  • müstakil
  • Kaldırıldı

Ve ilginizi çekmek için bu resmi bu derse ekleyeceğim:

Geçici

Aslında, nüanslar olmasa da her şey göründüğünden çok daha basit. Örneğin, Java kodunu kullanarak açık bir şekilde oluşturduğunuz ve Hazırda Beklet özelliğini kullanarak veritabanından yüklemediğiniz her Entity nesnesi, Geçici (saydam) bir duruma sahiptir.

EmployeeEntity employee = new EmployeeEntity();

Geçici durumu, Hazırda Bekletme'nin bu nesne hakkında hiçbir fikri olmadığı ve nesne üzerindeki hiçbir eylemin Hazırda Bekletme'yi etkilemediği ve Hazırda Beklet'in bu nesne üzerindeki çalışmasını etkilemediği anlamına gelir.

Bu tür nesnelere POJO - Düz Eski Java Nesnesi de denir . Terim genellikle hileli davranışlara sahip çeşitli nesnelerin zıttı olarak kullanılır. Mockito'nun yarattığı Moc nesnelerini hatırlıyor musunuz? Burada POJO değiller.

Bazı istemci kodları, Geçici durumdaki bir nesneyle çalışıyorsa, etkileşimleri çok basit bir şema ile açıklanabilir:

Kalıcı veya Yönetilen

Bir sonraki en yaygın durum, Hazırda Bekleme motoruyla ilgili nesnelerdir. Durumları Kalıcı (veya Yönetilen) olarak adlandırılır. Bu durumdaki bir nesneyi elde etmenin tam olarak iki yolu vardır:

  • Hazırda Beklet modundan nesne yükleyin.
  • Nesneyi Hazırda Bekletme modunda kaydedin.

Örnekler:

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

Böyle bir nesne genellikle veritabanındaki bir tür kayda karşılık gelir, bir kimliği vardır ve benzerleri. Bu nesne, Hazırda Bekleme oturumuna eklenir ve genel olarak gerçek bir nesne tarafından değil, bir tür vekil tarafından temsil edilebilir.

session.load() yöntemini çağırdıktan sonra , bir saplama nesnesi (proxy) geri almanız ve veritabanına yapılan tüm çağrıların yalnızca bu nesnenin yöntemleri çağrıldıktan sonra gerçekleştirilmesi oldukça olasıdır . Ancak bu tür detaylardan biraz sonra bahsedeceğiz.

İstemci kodu ile Yönetilen durumundaki nesne arasındaki etkileşim aşağıdaki resimle açıklanabilir:

müstakil

Bir sonraki durum, nesnenin oturumdan ayrıldığı zamandır. Yani, nesne Hazırda Bekletme oturumuna eklendikten sonra oturum kapatılır veya işlem sonlandırılır ve Hazırda Bekletme artık bu nesneyi izlemez.

Örnek:

session.close();
session.evict(entity);

İlk örnekte oturum kapatıldı. İkinci durumda, evict() yöntemini kullanarak nesneyi oturumdan ayırmak istediğimizi açıkça belirtmiştik .

Yeni kod-nesne etkileşim şeması şöyle görünecektir:

Ve burada ilginçleşiyor. Nesneniz Hibernate'den alındıysa, size gerçek bir nesne yerine bir proxy verilmiş olabilir. Ve bu proxy nesnesi, oturumdan ayrıldıktan sonra, yöntemleri çağrıldığında istisnalar atacaktır.

Bu, Hibernate ile çalışırken tüm yeni başlayanlar için en yaygın sorundur. Bir Entity nesnesiyle çalışırken, bunun gibi soruların yanıtını herhangi bir zamanda tam olarak bilmeniz gerekir :

  • Gerçek bir nesneniz mi var yoksa gerçek bir nesneden yalnızca bir proxy'niz mi var?
  • Şu anda bir işlemde misiniz, değil misiniz?
  • Bir okuma-yazma işlemi mi yoksa salt okunur bir işlem mi?
  • Nesne, LazyLoading mekanizması tarafından yönetiliyor mu?
  • Nesnenin hangi bölümleri zaten belleğe yüklenmiştir ve erişildiğinde hangi bölümleri yüklenecektir?
  • Nesneniz bağımlı nesnelere nasıl bağlanır?

İyi haber şu ki çoğu zaman bariz. Ama yine de her şeyin kaputun altında nasıl çalıştığını anlamanız gerekiyor. Bildirime dayalı programlama budur - 10 dakikada kod yazabilir, neden olması gerektiği gibi çalışmadığını anlayabilirsiniz - 10 saat içinde :)

Kaldırıldı

Ve Entity nesnenizin sahip olabileceği son durum Kaldırıldı. Muhtemelen adından da tahmin ettiğiniz gibi, bu uzak bir nesnenin durumudur.

Bu durum, veritabanından bir nesneyi silerseniz, Java nesnesinin hiçbir yerde hemen kaybolmaması nedeniyle ortaya çıkar.

Employee employee = session.load(Employee.class, 1);
//after loading the object's state is Persisted

session.remove(employee);
//after deletion, the state of the object is Removed

session.save(employee);
//and now Persisted again

session.close();
//and now the Detached state