簡體   English   中英

如何測試延遲加載的JPA集合是否已初始化?

[英]How to test whether lazy loaded JPA collection is initialized?

我有一個從外部代碼獲取JPA實體的服務。 在這個服務中,我想迭代一個延遲加載的集合,該集合是該實體的一個屬性,以查看客戶端是否相對於DB中的當前版本添加了一些內容。

但是,客戶端可能從未觸及過該集合,因此它仍未初始化。 這導致眾所周知

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

當然,如果客戶從未觸及過該集合,我的服務無需檢查它是否有可能發生變化。 問題是我似乎無法找到一種方法來測試集合是否已初始化。 我想我可以在它上面調用size() ,如果它拋出LazyInitializationException我會知道,但我試圖不依賴於這樣的模式。

在某處有一些isInitialized()方法嗎?

你在用JPA2嗎?

PersistenceUnitUtil有兩種方法可用於確定實體的加載狀態。

例如,組織和用戶之間存在雙向的OneToMany / ManyToOne關系。

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();
}
org.hibernate.Hibernate.isInitialized(..)

據我所知,沒有標准的JPA解決方案。 但是如果你想實際初始化集合,你可以創建一個實用工具方法並迭代它們(只有一次迭代就足夠了)。

正如另一張海報所示,Hibernate有一個方法。 但是,在純JPA中沒有解決方案。

對於eclipselink ,用戶會轉換您嘗試訪問org.eclipse.persistence.indirection.IndirectList的集合,然后調用其isInstantiated()方法。 以下鏈接提供了更多信息:

http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/indirection/IndirectList.html#isInstantiated

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM