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

Ale*_*nov 14 hibernate jpa openjpa eclipselink datanucleus

即使在创建实体管理器的实体管理器不再可用之后,EclipseLink也可以在实体中加载延迟关系.使用Hibernate 这不起作用,或者至少在该帖子时没有.

其他提供商怎么样?特别是OpenJPA和DataNucleus?

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

Tim*_*ote 12

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

所有这一切,延迟加载都有缺点.开发人员必须了解他的提取策略,并且必须能够区分每种策略最适用的时间和地点.否则,您可能会遇到严重的性能问题,例如N + 1选择问题.另外,在渲染视图期间,您可能会遇到数据库异常.

关于OpenJPA和DataNucleus:虽然我从未使用过,但这篇文章表明OpenJPA也需要OpenSessionInViewFilter延迟加载.这个SO答案这个论坛帖子表明DataNucleus需要一个OpenPersistenceManagerInViewFilter延迟加载.


Ste*_*ers 8

请注意,Hibernate 4.1.6增加了对通过hibernate.enable_lazy_load_no_transJPA属性在事务外部加载延迟数据的支持.

似乎没有被广泛使用/知道 - 唯一的官方文档似乎是功能票 - 所以可能值得一些谨慎.

在我的(有限)经验中,它通常似乎运行良好,除了它似乎不在双向关系的"映射"侧获取实体.


Dat*_*eus 5

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

DataNucleus JPA可以很好地执行事务之外的字段的延迟加载.显然,您需要声明是否正在使用TRANSACTION或EXTENDED 持久性上下文运行,因为在前一种情况下,对象在事务提交时得到DETACHED(并且一旦分离就不能延迟加载),而在后者中,对象仍然存在管理(你可以在这种情况下懒惰).