如何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()
方法。 以下链接有更多信息: