繁体   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