Hazırda Bekletme İpucu: Tembel yüklü ilişkiler nasıl başlatılmalıdır?

Portakalkafa

Global Mod
Global Mod


  1. Hazırda Bekletme İpucu: Tembel yüklü ilişkiler nasıl başlatılmalıdır?

Hazırda Bekletme İpuçları serisi, yaygın Hazırda Bekletme sorularına hızlı ve kolay çözümler sunar. Bu sefer tembel ve yüklü ilişkilerin ideal bir şekilde başlatılmasıyla ilgili.


rica etmek


Bir dosyayı almak için bir varlık yüklerken yüklü bir tembel ilişkiyi nasıl başlatabilirim? LazyInitializationException kaçınmak?

çözüm


Hazırda bekletme her zaman birini başlatır LazyInitializationException, bir ilişkinin öğeleri etkin bir hazırda bekletme oturumu olmadan yüklenecekse. Aşağıdaki örnekte olduğu gibi:

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Author a = em.createQuery("SELECT a FROM Author a WHERE id = 1", Author.class).getSingleResult();

em.getTransaction().commit();
em.close();

log.info(a.getFirstName()+" "+a.getLastName()+" wrote "+a.getBooks().size()+" books.");


Bunu önlemek için, hazırda bekletme oturumu kapatılmadan önce ilişkinin başlatılması gerekir. JPA ve Hibernate bunun için çeşitli seçenekler sunar. En basiti bir GETİRMEYE KATIL-Madde. ek anahtar kelime ALACAK Hibernate’e yalnızca bu sorgu için varlıkları birleştirmesini değil, aynı zamanda bunları birlikte yüklemesini söyler. Bu, ilişkiyi ve ardından gelen ilişkiyi başlatır. LazyInitializationException önlenmiş.

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Author a = em.createQuery("SELECT a FROM Author a JOIN FETCH a.books WHERE a.id = 1", Author.class).getSingleResult();

em.getTransaction().commit();
em.close();

log.info(a.getFirstName()+" "+a.getLastName()+" wrote "+a.getBooks().size()+" books.");



Geç yüklenen ilişkileri başlatma hakkında daha fazla bilgi edinin


the GETİRMEYE KATIL-lause, tembel yüklü ilişkileri başlatmanın mevcut yollarından sadece biridir. Diğer seçenekler bir @NamedEntityGraph veya oluşturulan bir ad hoc Varlık Grafiği. Bunlar, sorgudan bağımsız bir varlık grafiğinin tanımının sorguyla birlikte yüklenmesine izin verir.

Her üç seçenek de sadece engellemez LazyInitializationException. İyi bilinen “n+1 seçimi” probleminden kaçınmak için de kullanılabilirler.

Hazırda Bekletme İpuçları: Kitap


“Hibernate Tips: 70+ Solutions to Common Hibernate Problems” adlı kitabım, basit ve karmaşık eşleme tanımları, günlüğe kaydetme, Java 8 desteği, önbelleğe alma ve statik sorgu oluşturma ve dinamik gibi konularda 70’den fazla tarif içeriyor. Amazon’da basılı ve e-kitap biçiminde ve hibernate-tips.com adresinde PDF biçiminde mevcuttur.


()



Haberin Sonu
 
Üst