[英]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()
方法。 以下鏈接提供了更多信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.