JPA + ProsseLink-使用封闭的安全管理器延迟加载

eni9jsuy  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(119)

我在一个Java SE项目中使用JPA提供者作为JPA提供者。我已经正确地配置了编织,以允许延迟加载。
与Hibernate(抛出LazyInitializationException)不同的是,即使是封闭的AlternityManager,AlternseLink也可以获得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.
}

谢谢.

puruo6ea

puruo6ea1#

即使在已关闭的LattyManager中,LattyLink也允许您访问惰性关系。这种行为是特定于WebseLink的,而不是JPA规范的一部分。
当连接被关闭时,您将得到您正在寻找的异常。
但是,ProsseLink将未示例化的Lists Package 到IndirectList中。您可以通过编程方式检查List是否已示例化。

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

另请参阅:

toiithl6

toiithl62#

模式“视图中的jpa会话”是您的朋友。基本上:在请求周期中,你打开了EmptyManager(很早或在请求时),不要在应用程序代码中关闭(所有惰性元素都可以被获取),并在最后一个操作中自动关闭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是在EntityManager早期阶段打开的代理(几乎在Eclause中生成)。上面的“如果"是因为开始应用程序,这不是我们讨论的一部分。
在其他框架中以适当的方式。这取决于你。
答案有两个路径:完整的JEE容器(程序员代码不会打开或关闭EM)和servlet容器。我的答案是第二个。
注:此模式中的word session 不是Web Session或JPA引擎的sense入口参数中的not Session。这只是一句话,)

bakd9h0s

bakd9h0s3#

似乎没有设置,但您可以在分离实体后显式清除会话:((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了解如何实施。

相关问题