如何testing延迟加载的JPA集合是否被初始化?

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

但是,客户可能从来没有碰过这个集合,所以它还没有被初始化。 这导致众所周知的

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

当然,如果客户从未触摸收集,我的服务不必检查可能的更改。 问题是,我似乎无法find一种方法来testing集合是否被初始化。 我想我可以调用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解决scheme。 但是如果你想实际初始化集合,你可以创build一个实用的方法并迭代它们(只有一次迭代就足够了)。

正如另一张海报所示,Hibernate有一个这样的方法。 但是,在纯JPA中没有解决这个问题的方法。

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

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