Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA&x2B;EclipseLink-使用封闭的EntityManager延迟加载_Java_Jpa_Jdbc_Eclipselink_Lazy Loading - Fatal编程技术网

Java JPA&x2B;EclipseLink-使用封闭的EntityManager延迟加载

Java JPA&x2B;EclipseLink-使用封闭的EntityManager延迟加载,java,jpa,jdbc,eclipselink,lazy-loading,Java,Jpa,Jdbc,Eclipselink,Lazy Loading,我在JavaSE项目中使用EclipseLink作为JPA提供者。我已经正确地配置了编织以允许延迟加载 与Hibernate不同(Hibernate抛出LazyInitializationException),EclipseLink可以获得惰性关系的代理,即使使用封闭的EntityManager。要运行此查询,它将从池中获取一个新连接 是否存在禁用或更改此功能行为的设置?在尝试访问未加载的属性(如Hibernate)时,需要获取null值或异常 例如: List<Customer>

我在JavaSE项目中使用EclipseLink作为JPA提供者。我已经正确地配置了编织以允许延迟加载

与Hibernate不同(Hibernate抛出LazyInitializationException),EclipseLink可以获得惰性关系的代理,即使使用封闭的EntityManager。要运行此查询,它将从池中获取一个新连接

是否存在禁用或更改此功能行为的设置?在尝试访问未加载的属性(如Hibernate)时,需要获取null值或异常

例如:

List<Customer> customers = entityManager.createQuery("from Customer c", Customer.class).getResultList();
entityManager.close(); // Closing the EntityManager

for (Customer customer: customers) {
    customer.getAddress(); // Here EclipseLink executes a query to get the relationship.
}
List customers=entityManager.createQuery(“来自客户c”,Customer.class).getResultList();
entityManager.close();//关闭EntityManager
用于(客户:客户){
customer.getAddress();//此处EclipseLink执行查询以获取关系。
}
谢谢。

模式“查看jpa会话”是您的朋友。基本上:在请求周期中,您打开EntityManager(很早或根据请求),不要关闭应用程序代码(所有惰性元素都可以提取),并在最后一个操作中自动关闭EM

我也有同样的问题。 就我个人而言,我使用Wicket,替换

class MyWebRequestCycle extends RequestCycle {
... // extract from bigger project
protected void onEndRequest() {
        super.onEndRequest();
        if (em != null) {
            if (em instanceof MyEntityManager) {
                MyEntityManager em2 = (MyEntityManager) em;
                em2.original.close();
            } else
                em.close();
            em = null;
        }
}
}

MyEntityManager
是早期过度打开的代理(几乎在Eclpse中生成)
EntityManager
。如果上面的“如果”是因为应用程序的启动,则不属于我们讨论的一部分

以适当的方式在其他框架中。这取决于你

答案有两条路径:完整的JEE容器(程序员代码不会打开或关闭EM)和servlet容器。我的答案是第二个


备注:此模式中的word会话不是web会话,也不是JPA引擎输入参数意义上的会话。这只是一个词;)

EclipseLink允许您访问惰性关系,即使EntityManager已关闭。这种行为是EclipseLink特有的,不是JPA规范的一部分

当连接关闭时,您将得到正在查找的异常

但是,EclipseLink正在将未实例化的列表包装到
间接列表中。您可以通过编程方式检查列表是否已实例化

if(customers instanceof IndirectList) {
    boolean foo = ((IndirectList) customers).isInstantiated();
    // ... 
}
另见:


谢谢,但这种模式并不能解决我的问题。我需要EclipseLink不进行查询以返回惰性关系,我需要它返回null。我建议不要使用“视图中的开放会话”:它在Hibernate中被视为反模式,我怀疑EclipseLink是否认为它更好。谢谢,但在我的情况下,它是一种多人关系。我尝试使用Persistence.getPersistenceUtil().IsLoaded()方法进行检查,但两种方法都不起作用。