JPA + EclipseLink - 使用封闭的 EntityManager 进行延迟加载

问题描述 投票:0回答:3

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

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

是否有某些设置可以禁用或更改此功能的行为?当尝试访问已卸载的属性时,我需要获取 null 值或异常,例如 Hibernate 所做的。

示例:

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.
}

谢谢。

java jpa jdbc eclipselink lazy-loading
3个回答
4
投票

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

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

但是,EclipseLink 将未实例化的列表包装到

IndirectList
中。您可以以编程方式检查列表是否已实例化。

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

另请参阅:


0
投票

模式“jpa session in view”是您的朋友。基本上:在请求周期期间,您打开 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 容器。我的答案是第二个。

备注:该模式中的单词session不是Web Session,也不是JPA引擎的sense入口参数中的Session。这只是一个词;)


0
投票

似乎没有设置,但您可以在分离实体后显式清除会话:

((FetchGroupTracker)entity)._persistence_setSession(null)

另请参阅https://github.com/eclipse-ee4j/eclipselink/blob/7dfeab504e7b0042e6330315297bed0e6739cc95/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/FetchGroup.java# L165 关于如何实现这一点。

© www.soinside.com 2019 - 2024. All rights reserved.