即使创建实体的实体管理器不再可用,EclipseLink 也可以加载实体中的惰性关系。使用 hibernate this doesn't work ,或者至少在发表该文章时还没有。
其他提供商怎么样?尤其是 OpenJPA 和 DataNucleus?
这样做有什么缺点(除了更复杂的实现之外)?
最佳答案
尽管 Hibernate 确实需要相同的 EntityManager 才能延迟加载对象,但使用 Open Session in View Pattern 可以轻松实现灵活的延迟加载。 。本质上,只要需要,您就可以使 EntityManager 保持打开状态。我开发了客户端应用程序,只要应用程序打开,该应用程序就保持相同的 EntityManager 打开。这将为您提供与本文中描述的基本相同的行为。然而,它肯定比罗马描述的“开箱即用”延迟加载更难实现。
话虽如此,there are downsides to lazy loading 。开发人员必须了解他的获取策略,并且必须能够区分每种策略最适用的时间和地点。否则,您可能会遇到严重的性能问题,例如 N+1 Select Problem 。另外,在 View 渲染期间您总是有可能遇到数据库异常。
关于 OpenJPA 和 DataNucleus:虽然我从未使用过,this post表示 OpenJPA 还需要一个 OpenSessionInViewFilter 来进行延迟加载。 This SO answer和 this forum post表明 DataNucleus 需要一个 OpenPersistenceManagerInViewFilter
来延迟加载。
关于hibernate - JPA:哪些实现支持延迟加载外部事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10161165/