Eclipselink:静态和动态编织之间的差异

时间:2016-06-10 07:08:32

标签: java jpa eclipselink

我使用eclipselink 2.6.3并拥有以下代码:

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());
}

情况1: 当编织是静态的(<property name="eclipselink.weaving" value="static"/> + de.empulse.eclipselink编织插件)时,我们执行temp.getName(),执行SQL查询并加载必要的数据。尽管我们确实关闭了实体经理。我希望在temp.getName()上得到异常。

情况2: 但是,当编织是动态的(<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)

如何解释这种差异?这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

如果您将应用程序作为桌面(独立),tomcat或jetty运行,则默认情况下无法使用动态编织,并且不支持延迟提取,所有延迟提取都将被视为急切。

关于静态编织,以下内容来自eclipselink教程: http://wiki.eclipse.org/EclipseLink/Examples/JPA/Tomcat_Web_Tutorial

  

JPA的限制
  由于Tomcat不是Java EE 5兼容服务器,   对JPA有一些限制。没有动态编织   (仪表)
   - 静态编织实体仍可通过   EclipseLink没有@EJB注入会话bean(包含   EntityManager)可用     - 使用持久性工厂和经理   直接没有@PersistenceContext注入一个托管的容器   持久性单位可用   - 使用   Persistence.createEntityManagerFactory(JTA_PU_NAME)

使您的实体支持静态编织: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Performance/Weaving/Static_Weaving