尋找一些專業知識,然後我宣佈NHibernate框架破碎或我瘋了!用nHibernate加載一棵樹重新查詢葉節點
我試圖用NHibernate熱切地加載一個自引用樹,並且可以成功加載大多數兒童列表,但我似乎無法讓它與葉節點一起工作。我的查詢是:
"select p from Proposal p join fetch p.Structures s join fetch s.theChildrenList c " +
"where p._persistenceId = :p1 and s.theProposal = :p1 and c.theProposal = :p1")
.SetParameter("p1", aProposalId)
.SetResultTransformer(new DistinctRootEntityResultTransformer()).
UniqueResult<Proposal>();
這將正確返回所有記錄,但沒有正確填充葉子節點的子列表(應按定義爲空)。相反,當我得到一個代理和搜索樹時,成千上萬的毫無意義的零記錄查詢。
我已經試過: 1.使用左連接,而不是加入 2.使孩子們的名單不是懶惰和取=「加入」並移除HQL(作爲一個概念證明,業績下滑是不可接受的別處) 3.混淆了我沒有發現的屬性,我看到有人在休眠論壇中使用
所有這些都給了我相同的結果......一個包含所有數據(好)和數千個小查詢的大型查詢沒有數據返回(壞)。有任何想法嗎?
我使用NHibernate 2.2和這裏的映射文件的相關部分供參考:
<many-to-one name="theParentStructure"
column="PARENT_STRUCTURE_ID"
class="Structure"
access="field"
update="false"
insert="false"
not-found="ignore"/>
<bag name="theChildrenList"
generic="true"
table="STRUCTURE"
access="field"
cascade="all-delete-orphan"
inverse="true" fetch="join" lazy="false"> <--Both with and without the last two properties
<key column="PARENT_STRUCTURE_ID" />
<one-to-many class="Structure"/>
</bag>
任何幫助,將不勝感激!
嗯,在預置樹遍歷上有趣的想法,但遍歷樹不是我的問題,它的_getting_樹!我實際上已經研究過你的第一個解決方案(好吧,先前的'版本鏈接'),但它似乎並沒有解決nHibernate重新查詢所有葉節點的根本問題。我現在的代碼得到所有正確的數據,nHibernate似乎並不明白當你沒有孩子時缺少行是因爲他們'不存在',並不是我們還沒有爲他們查詢...... – JCFire
我已經更新了我的答案 - 我已經添加了一篇關於在NHibernate中映射樹的好文章的鏈接,但說實話,我不認爲您可以輕鬆防止沒有「黑客/技巧」的附加查詢。另一方面,爲什麼您可以自己重新創建層次結構並更新映射,以便不通過代理查詢子實體? – MonkeyCoder
我希望不必重新創建結構的基礎,因爲它是整個系統的基礎,但我越看這個問題,看起來似乎越像這個答案(至少在這裏另一個月對舊應用程序進行重新編碼......)我希望更多地瞭解Ayende在這裏談到的內容:[link](http://ayende.com/blog/4151/nhibernate-tips-tricks有效地選擇樹) – JCFire