JPA:哪些实现支持在事务外部延迟加载?

时间:2012-04-15 10:20:19

标签: hibernate jpa eclipselink openjpa datanucleus

EclipseLink可以在实体中加载延迟关系,即使在创建它们的实体管理器不再可用之后也是如此。使用Hibernate this doesn't work,或者至少在该帖子时没有。

其他提供商呢?特别是OpenJPA和DataNucleus?

这有什么缺点(除了更复杂的实现)?

3 个答案:

答案 0 :(得分:12)

虽然Hibernate确实需要相同的EntityManager才能延迟加载对象,但使用Open Session in View Pattern很容易实现灵活的延迟加载。实质上,只要您需要,就可以保持EntityManager处于打开状态。我已经开发了客户端应用程序,只要应用程序处于打开状态,就可以保持相同的EntityManager处于打开状态。这将为您提供与本文中描述的基本相同的行为。但是,实施起来肯定比开箱即用更难实现。延迟加载罗马描述。

所有这一切,there are downsides to lazy loading。开发人员必须了解他的提取策略,并且必须能够区分每种策略最适用的时间和地点。否则,您最终可能会遇到严重的性能问题,例如N+1 Select Problem。此外,您还可能在呈现视图期间获得数据库异常。

关于OpenJPA和DataNucleus:虽然我从未使用过,this post表示OpenJPA也需要OpenSessionInViewFilter来进行延迟加载。 This SO answerthis forum post表示DataNucleus需要OpenPersistenceManagerInViewFilter进行延迟加载。

答案 1 :(得分:8)

Note that Hibernate 4.1.6 added support for loading lazy data outside transactions via the hibernate.enable_lazy_load_no_trans JPA property.

Doesn't seem to be very widely used / known about - the only official documentation seems to be a feature ticket - so probably worth applying some caution.

In my (limited) experience, it generally seems to work well except that it doesn't seem to fetch entities on the "mapped" side of bi-directional relationships.

答案 2 :(得分:5)

如果您没有EntityManager,则不了解数据存储区,EMF或其他任何内容。所以,如果你想要便携式,那么你不能做懒加载(除了在你自己的对象中体现这些信息)...即在JPA规范之外。

DataNucleus JPA可以很好地执行交易之外的延迟加载字段。显然,如果您使用TRANSACTION或EXTENDED 持久性上下文运行,则需要说明,因为在前一种情况下,对象在提交事务时会得到DETACHED(并且一旦分离就不能进行延迟加载),在后者中,对象保持管理状态(在这种情况下你可以延迟加载)。