【问题标题】:JPA + EclipseLink - Lazy Loading with closed EntityManagerJPA + EclipseLink - 使用封闭的 EntityManager 进行延迟加载
【发布时间】:2015-12-18 02:26:58
【问题描述】:

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

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

是否有一些设置会禁用或更改此功能的行为?在尝试访问未加载的属性时,我需要获取空值或异常,例如 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


    【解决方案1】:

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

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

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

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

    另见:

    【讨论】:

    • 谢谢,但在我的情况下是多对一关系。我试过用 Persistence.getPersistenceUtil().IsLoaded() 方法检查,但都没有成功。
    【解决方案2】:

    模式“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 中过度打开。而上面的'if'是因为开始申请,不在我们讨论范围内。

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2012-09-13
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多