在使用Fluent nHibernate进行开发时,我注意到在关系上我可以指定Fetch
属性,可能有Select()
,Join()
和Subselect()
选项。
我对这些进行了一些搜索,但收集的信息非常少。我确实在nHibernate文档和流畅的nHibernate文档中找到了它们,但除了提供签名之外别无其他,这对我没有多大帮助。
我想知道是否有任何真实的解释,这些是什么,以及他们真正做了什么。我自己一直很困惑。根据我自己的评估,他们似乎改变了引用实体被拉入对象图的方式,但我还没有完全辨别出如何他们改变它,哪一个最适合什么情况..
我确实找到了这篇博文(http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/),其中有一些细节,但我仍然对整个情况感到困惑。我还看到其他使用Select()
的状态更为优化的例子,但其背后的原因。另外,我在(http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies)发现了一个面向原始Java Hibernate平台的帖子,但我认为这个概念是相同的。在这一篇中,我的理论似乎有点夸张,因为它更多地关注他们所做的懒惰加载方面,但我还没有看到任何非常平坦的例子。
答案 0 :(得分:21)
加入提取 - NHibernate使用OUTER JOIN在同一个SELECT中检索关联的实例或集合。
选择提取 - 第二个SELECT用于检索关联的实体或集合。除非您通过指定lazy =“false”显式禁用延迟提取,否则只有在您实际访问关联时才会执行第二次选择。
子选择提取 - 第二个SELECT用于检索在先前查询或提取中检索的所有实体的关联集合。除非您通过指定lazy =“false”显式禁用延迟提取,否则只有在您实际访问关联时才会执行第二次选择。
查看提取策略文档@ The Nhibernate Documentation
答案 1 :(得分:3)
我并不熟悉nHibernate(我使用Hibernate和Java),但基于类比,这使您可以指定要与给定实体一起急切加载的关联/集合属性。当你没有完全控制(n)Hibernate会话时(例如,像Java中的Spring这样的其他框架正在处理会话/事务),这很有用。 所以你的假设基本上是正确的。 选择,加入和子选择是获取相关属性的方法,并确定将在数据库中执行哪种查询。哪一个是最优的,实际上取决于你的情况。
希望这有点帮助,
欢呼声。