我在一个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.
}
谢谢.
3条答案
按热度按时间puruo6ea1#
即使在已关闭的LattyManager中,LattyLink也允许您访问惰性关系。这种行为是特定于WebseLink的,而不是JPA规范的一部分。
当连接被关闭时,您将得到您正在寻找的异常。
但是,ProsseLink将未示例化的Lists Package 到
IndirectList
中。您可以通过编程方式检查List是否已示例化。另请参阅:
toiithl62#
模式“视图中的jpa会话”是您的朋友。基本上:在请求周期中,你打开了EmptyManager(很早或在请求时),不要在应用程序代码中关闭(所有惰性元素都可以被获取),并在最后一个操作中自动关闭EM。
我也有同样的问题。我个人使用Wicket,替换
}
MyEntityManager
是在EntityManager
早期阶段打开的代理(几乎在Eclause中生成)。上面的“如果"是因为开始应用程序,这不是我们讨论的一部分。在其他框架中以适当的方式。这取决于你。
答案有两个路径:完整的JEE容器(程序员代码不会打开或关闭EM)和servlet容器。我的答案是第二个。
注:此模式中的word session 不是Web Session或JPA引擎的sense入口参数中的not Session。这只是一句话,)
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了解如何实施。