有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA:如果EntityManager关闭,为什么会加载惰性字段

我使用eclipselink并具有以下代码:

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

编辑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) 个答案

  1. # 1 楼答案

    因为这是EclipseLink,它支持字段的分离加载。。。i、 e不在JPA规范中并且完全不可移植的东西(即在其他实现中不受支持)。它的“分离”状态不是真正的“分离”,并与EntityManagerFactory保持联系。如果你关闭EMF,它们就会真正“分离”

    this email chain discussing the "feature"。它没有提到一种关闭它的方法(这样你就可以拥有便携的行为),事实上,它要求用户请求它!关于JPA TCK为什么不检查可移植行为的问题,需要问Oracle。。。但是等一下,日食小组写了TCK不是吗。。。嗯

    为了保持便携性,您将按照JPA规范进行分离,而不依赖于此类行为