Java JPA&x2B;EclipseLink-使用封闭的EntityManager延迟加载
我在JavaSE项目中使用EclipseLink作为JPA提供者。我已经正确地配置了编织以允许延迟加载 与Hibernate不同(Hibernate抛出LazyInitializationException),EclipseLink可以获得惰性关系的代理,即使使用封闭的EntityManager。要运行此查询,它将从池中获取一个新连接 是否存在禁用或更改此功能行为的设置?在尝试访问未加载的属性(如Hibernate)时,需要获取null值或异常 例如:Java JPA&x2B;EclipseLink-使用封闭的EntityManager延迟加载,java,jpa,jdbc,eclipselink,lazy-loading,Java,Jpa,Jdbc,Eclipselink,Lazy Loading,我在JavaSE项目中使用EclipseLink作为JPA提供者。我已经正确地配置了编织以允许延迟加载 与Hibernate不同(Hibernate抛出LazyInitializationException),EclipseLink可以获得惰性关系的代理,即使使用封闭的EntityManager。要运行此查询,它将从池中获取一个新连接 是否存在禁用或更改此功能行为的设置?在尝试访问未加载的属性(如Hibernate)时,需要获取null值或异常 例如: List<Customer>
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.
}
List customers=entityManager.createQuery(“来自客户c”,Customer.class).getResultList();
entityManager.close();//关闭EntityManager
用于(客户:客户){
customer.getAddress();//此处EclipseLink执行查询以获取关系。
}
谢谢。模式“查看jpa会话”是您的朋友。基本上:在请求周期中,您打开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容器。我的答案是第二个
备注:此模式中的word会话不是web会话,也不是JPA引擎输入参数意义上的会话。这只是一个词;) EclipseLink允许您访问惰性关系,即使EntityManager已关闭。这种行为是EclipseLink特有的,不是JPA规范的一部分 当连接关闭时,您将得到正在查找的异常 但是,EclipseLink正在将未实例化的列表包装到
间接列表中。您可以通过编程方式检查列表是否已实例化
if(customers instanceof IndirectList) {
boolean foo = ((IndirectList) customers).isInstantiated();
// ...
}
另见:
谢谢,但这种模式并不能解决我的问题。我需要EclipseLink不进行查询以返回惰性关系,我需要它返回null。我建议不要使用“视图中的开放会话”:它在Hibernate中被视为反模式,我怀疑EclipseLink是否认为它更好。谢谢,但在我的情况下,它是一种多人关系。我尝试使用Persistence.getPersistenceUtil().IsLoaded()方法进行检查,但两种方法都不起作用。