当前位置: 首页 > 知识库问答 >
问题:

JPA Eclipse Link-关闭实体管理器的懒惰加载

焦博实
2023-03-14

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

与HiberNate(抛出LazyPresalizationExctive)不同,Eclipse Link可以获得LAZY关系的代理,即使是在封闭的实体管理器中。要运行此查询,它从池中获得一个新连接。

是否存在禁用或更改此功能行为的设置?在尝试访问未加载的属性(如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.
}

谢谢。

共有2个答案

夏侯俊美
2023-03-14

模式“视图中的jpa会话”是你的朋友。基本上:在请求周期中,你打开实体管理器(相当早或根据请求),不要关闭你的应用程序代码(所有懒惰元素都可以获取),并在最后一个操作中自动关闭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引擎输入参数意义上的会话。这只是一个词;)

邓光赫
2023-03-14

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

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

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

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

另见:

  • https://community.oracle.com/message/1708796
  • https://eclipse.org/eclipselink/api/2.0/org/eclipse/persistence/indirection/IndirectList.html

 类似资料:
  • 我在理解实体框架5中的延迟加载时遇到问题。我理解在使用延迟加载时,直到请求时才会加载相关实体: 使用延迟加载时,初始查询只引入目标实体集。但是,每当访问导航属性时,就会对存储发出另一个查询以加载相关实体。(引用) 我有一个包含两个类的ASP.NET Web API项目: 我将LazyLoadingEnabled设置为true,并使我的POCO类符合指南(参考),但当我使用scaffolding创建

  • 我有一个数据表的问题-懒加载。我认为问题是在IdiomasBean.java(TableBean.java),如果我把: 我得到了正确的数据表,但是<代码>按排序、筛选和不起作用。 我得到:java。lang.NullPointerException这里是堆栈跟踪: 下面是代码的其余部分: 指数xhtml diomasBean.java 懒散的数据模型。JAVA IdiomasBo.java 习语

  • 问题内容: 我有下面的方法。 实体管理器的上述用法可以吗?或者有必要关闭em吗?有任何建议。 问题答案: 我想答案是: 取决于 。 您的实体管理员是获得对实体所在上下文访问权限的关键。如果您的应用程序是JSE应用程序,则必须考虑上下文的​​预期寿命是多少。 让我们考虑您将根据用户的请求创建一个实体管理器。因此,在您处理给定的请求时,您将保持实体管理器处于打开状态,完成后将其关闭。 在JSE应用程序

  • 实体管理器的上述用法可以吗?或者有必要关闭EM?有什么建议请。

  • 我正在使用教义2来绘制学术时间表。以下是对这些关系的简化观察: 一个类有事件(一对多) 事件具有类型(多对一) 一个事件有一个位置(多对一) 使用

  • 在Raku文档中,说明了收集-获取构造被延迟计算。在下面的示例中,我很难总结出构造的懒惰: 为什么我们在行为上有区别?尽管我们尝试做同样的事情:以懒惰的方式为数组分配Seq 有人能澄清一下这件事吗???