我將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
可能重複的[JPA EntityManager.detach()仍然加載懶惰關係](http://stackoverflow.com/questions/37562870/jpa-entitymanager-分離仍然加載懶惰關係) –