java-如何测试延迟加载的JPA集合是否已初始化?

我有一个从外部代码获取JPA实体的服务。 在此服务中,我想遍历一个延迟加载的集合(该实体的属性),以查看客户端是否相对于数据库中的当前版本向其添加了一些内容。

但是,客户端可能从未接触过该集合,因此仍未初始化。 这导致众所周知

isInitialized()

当然,如果客户从未接触过该产品系列,那么我的服务就不必检查它是否有可能更改。 事实是,我似乎找不到找到测试集合是否已初始化的方法。 我想我可以打电话给isInitialized(),如果它抛出LazyInitializationException,我就知道了,但是我试图不依赖于这种模式。

某处有一些isInitialized()方法吗?

akira asked 2020-06-30T03:54:27Z
4个解决方案
56 votes

您正在使用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();
}
dira answered 2020-06-30T03:54:50Z
25 votes
org.hibernate.Hibernate.isInitialized(..)

据我所知,没有标准的JPA解决方案。 但是,如果要实际初始化集合,则可以创建一个实用程序方法并对其进行迭代(仅一次迭代就足够了)。

Bozho answered 2020-06-30T03:55:10Z
2 votes

正如其他发布者指出的那样,Hibernate为此提供了一种方法。 但是,在纯JPA中没有解决方案。

robertgoko answered 2020-06-30T03:55:30Z
2 votes

对于eclipselink,用户强制转换了您试图访问org.eclipse.persistence.indirection.IndirectList的集合,然后调用其isInstantiated()方法。 以下链接具有更多信息:

[HTTP://呜呜呜.eclipse.org/eclipse link/API/1.1/org/eclipse/persistence/indirection/indirect list.HTML#is instantiated.]

amax answered 2020-06-30T03:55:55Z
translate from https://stackoverflow.com:/questions/4306463/how-to-test-whether-lazy-loaded-jpa-collection-is-initialized