2010-11-29 11 views
39

JPA varlığını dış koddan alan bir hizmetim var. Bu hizmette, istemcinin DB'deki geçerli sürüme göre bir şey ekleyip eklemediğini görmek için bu öğenin bir özniteliği olan tembel yüklü bir koleksiyon üzerinde yinelemek istiyorum. Bununla birlikte, müşteri koleksiyona hiç dokunmamış olabilir, bu yüzden hala başlatılmamış olabilir. Bu istemci koleksiyon dokunmadık bile, benim hizmet olası değişiklikler için bunu kontrol etmek zorunda değildir, iyi ElbetteTembel yüklenmiş JPA koleksiyonunun başlatılıp başlatılmadığı nasıl test edilir?

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.example.SomeEntity.

bilinen sonuçlanır. Mesele şu ki, koleksiyonun başlatılıp başlatılmadığını test etmenin bir yolunu bulamıyorum. Sanırım size()'u arayabilirim ve eğer LazyInitializationException'u atarsam, bu tür kalıplara bağlı olmamayı deniyorum.

Bazı yerlerde isInitialized() yöntemi var mı?

cevap

48

JPA2 kullanıyor musunuz? Bir öğenin yük durumunu belirlemek için kullanılabilecek iki yöntemi vardır.

örn. Kuruluş ve Kullanıcı arasında çift yönlü OneToMany/ManyToOne ilişkisi var. eclipselink için

public void test() { 
    EntityManager em = entityManagerFactory.createEntityManager(); 
    PersistenceUnitUtil unitUtil = 
     em.getEntityManagerFactory().getPersistenceUnitUtil(); 

    em.getTransaction().begin(); 
    Organization org = em.find(Organization.class, 1); 
    em.getTransaction().commit(); 

    Assert.assertTrue(unitUtil.isLoaded(org)); 
    // users is a field (Set of User) defined in Organization entity 
    Assert.assertFalse(unitUtil.isLoaded(org, "users")); 

    initializeCollection(org.getUsers()); 
    Assert.assertTrue(unitUtil.isLoaded(org, "users")); 
    for(User user : org.getUsers()) { 
     Assert.assertTrue(unitUtil.isLoaded(user)); 
     Assert.assertTrue(unitUtil.isLoaded(user.getOrganization())); 
    } 
} 

private void initializeCollection(Collection<?> collection) { 
    // works with Hibernate EM 3.6.1-SNAPSHOT 
    if(collection == null) { 
     return; 
    } 
    collection.iterator().hasNext(); 
} 
+1

Haklısınız, teşekkürler! Geç kabul için özür dilerim, yığın taşmasını kontrol etmeyi unuttum. – akira

20
org.hibernate.Hibernate.isInitialized(..) 

Bilgim için standart bir JPA çözümü yoktur. Ancak, koleksiyonları gerçekten başlatmak istiyorsanız, bir yardımcı program yöntemi oluşturabilir ve bunları yineleyebilirsiniz (yalnızca bir yineleme yeterlidir).

+1

Tam olarak aradığım şey bu, teşekkürler! Sorun şu ki, Hibernate'i kullanmam olsa bile, kod JPA uyumlu olmalı, bu yüzden maalesef bunu gerçekten kullanamıyorum :( – akira

+1

standart bir şey yok. – Bozho

+0

entityManager.find() oldukça standarttır;) farklı olarak, kod ayrıca EclipseLink üzerinde çalışmalıdır;) – akira

2

Diğer posterin belirttiği gibi, Hazırda Bekleme'nin bunun için bir yöntemi vardır. Bununla birlikte, saf JPA'da bunun için bir çözüm yoktur.

İlgili konular