2011-07-26 23 views
5

在使用Fluent nHibernate進行開發時,我注意到在關係上我可以指定Fetch屬性,可能的選項有Select(),Join()Subselect()Fluent nHibernate中的.Fetch.Select()是什麼?

我做了一些搜索,並得到很少的信息。我在nHibernate文檔和流暢的nHibernate文檔中找到了它們,但除了給出它們的簽名之外,它沒有什麼其他功能,這對我沒有太大的幫助。

我想知道這些是什麼以及他們真正做了什麼,是否有任何真正的解釋。我一直很困惑自己。從我自己的評價,他們似乎改變引用的實體被拉到對象圖的方式,但我還沒有完全辨別他們如何改變它,哪一個最適合什麼樣的情況?

我確實找到了這個博客文章(http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/),它有一點細節,但我仍然很困惑整個情況。我還看到其他使用Select()的示例更爲優化,但其背後的原因。此外,我在(http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies)上找到了一篇針對原始Java Hibernate平臺的文章,但我認爲這個概念是相同的。在這一個中,我的理論似乎有些變了,因爲它更側重於他們所做的懶惰加載方面,但我還沒有看到任何非常平坦的例子。

回答

3

我並不十分熟悉nHibernate(我使用Hibernate和Java),但是基於類比,這使您可以指定想要用給定實體急切加載的關聯/集合屬性。當你沒有完全控制(n)Hibernate會話時(例如,像Java中的Spring這樣的其他框架正在處理會話/事務),這很有用。 所以你的假設基本上是正確的。 Select,Join和Subselect是獲取相關屬性的方法,並確定將在數據庫中執行哪種查詢。哪一個最佳,取決於你所處的情況。

希望這會有所幫助,
乾杯。

18
  • 連接抓取 - NHibernate的檢索在SELECT語句的相關實例或集合,使用OUTER JOIN。

  • 選擇提取 - 第二個SELECT用於檢索關聯的實體或集合。除非您通過指定lazy =「false」來顯式禁用延遲讀取,否則只有在實際訪問關聯時纔會執行第二個選擇。

  • 子選擇提取 - 第二個SELECT用於檢索先前查詢或提取中檢索到的所有實體的關聯集合。除非您通過指定lazy =「false」來顯式禁用延遲讀取,否則只有在實際訪問關聯時纔會執行第二個選擇。

退房的數據抓取策略文件@ The Nhibernate Documentation