2016-06-10 86 views
4

我將EclipseLink,並具有以下代碼:JPA:爲什麼懶惰場裝載如果EntityManager的關閉

public Temp getTemp() { 
    EntityManager em=emf.createEntityManager(); 
    String queryString="SELECT a FROM Temp a"; 
    EntityGraph<Temp> eg = em.createEntityGraph(Temp.class); 
    eg.addAttributeNodes("id"); 
    //eg.addAttributeNodes("name"); 
    Query query = em.createQuery(queryString); 
    query.setHint("javax.persistence.fetchgraph", eg); 
    List<Temp> items=query.getResultList(); 
    em.close();// ENTITYMANAGER IS CLOSED 
    return items.get(0); 
} 

public void temp(){ 
    Temp temp=getTemp(); 
    System.out.println("id:"+temp.getId()); 
    System.out.println("name:"+temp.getName()); 
} 

正如你可以從代碼中看到的,我們只加載ID。但是,當我們執行temp.getName()時,會再次執行SQL查詢並加載必要的數據。爲什麼?我們確實關閉了實體經理。我期望得到temp.getName()的異常。

EDIT 1 一些研究,我發現了以下後 - 我如上所述是編織時的實際的行爲是靜態的(<property name="eclipselink.weaving" value="static"/> + de.empulse.eclipselink織造插件)。然而,當編織是動態的(<property name="eclipselink.weaving" value="true"/>)我得到異常:

java.lang.ClassNotFoundException: org.eclipse.persistence.internal.jpa.EntityManagerImpl not found by com.temp [57] 
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574) 
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79) 
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at com.temp.Temp._persistence_checkFetched(Temp2.java) 
    at com.temp.Temp._persistence_get_name(Temp2.java) 
    at com.temp.Temp.getName(Temp.java:44) 

所以問題搬到這裏:Eclipselink: Difference between static and dynamic weaving

+1

可能重複的[JPA EntityManager.detach()仍然加載懶惰關係](http://stackoverflow.com/questions/37562870/jpa-entitymanager-分離仍然加載懶惰關係) –

回答

2

因爲那是EclipseLink的,它支持領域的超脫加載...即東西是不是在JPA規範並且完全不可移植(即在其他實現中不受支持)。它的「分離」狀態並不真正「分離」,並保持與EntityManagerFactory的聯繫。如果關閉EMF,那麼它們會變成真正的「分離」。

請參閱this email chain discussing the "feature"。它沒有提及關閉它的一種方式(所以你可以有便攜式行爲),並且實際上要求這個人請求它!關於爲什麼JPA TCK不檢查便攜式行爲的問題是甲骨文所要求的......但是請繼續關注,EclipseLink團隊編寫TCK並不是他們......嗯..

要留便攜式,你會按照JPA規範分離,而不依賴於這種行爲

+0

也許你知道 - 有沒有辦法讓它「分離」而不關閉工廠,因爲它不可能解決方案關閉工廠這樣的目的? –

+0

請參閱編輯1 –