2012-12-20 32 views
1

我想做的事情在我的webapplication.I一個渴望獲取我的映射文件中有如下冬眠不是做預先抓取(使用取=「加入」懶=「假」)

<many-to-one name="user" class="com.xyz.beans.User" lazy="false" fetch="join"> 
    <column name="startedBy" /> 
</many-to-one> 
<many-to-one name="participantByParticipant1" class="com.xyz.beans.Participant" lazy="false" fetch="join" cascade="all" > 
    <column name="participant1" /> 
</many-to-one> 
<many-to-one name="participantByParticipant2" class="com.xyz.beans.Participant" lazy="false" fetch="join" cascade="all"> 
    <column name="participant2" /> 
</many-to-one> 

我有查詢如下

Query query = session.createQuery("from Post as p order by challenge.createdOn desc"); 
query.setFirstResult(0); 
query.setMaxResults(10); 

Participand表具有有一些映射到其他tables.And其獲取策略是相同 這需要大約2+秒來執行上述查詢,我​​可以看到以下通過生成的查詢冬眠 1選擇查詢獲取10帖子 20選擇查詢參與者tabel(因爲每個職位有2個參與者)

1)爲什麼這樣?爲什麼它沒有進行單一連接?
2)如何優化這個它的服用過多time.The表只爲10個記錄,現在

+0

「*我想在我的web應用程序中熱切地獲取所有內容。*」。爲什麼你需要熱切地取得一切?此外,XML映射沒有什麼問題,儘管現在趨勢是使用註釋而不是XML映射。它簡化了DAO。 – Lion

+0

因爲我需要在UI上顯示它。上面的查詢需要大約2秒,那太多了。我想一次性在一個selct語句中查找所有相關表格 – user93796

+0

如果您使用名爲['org.springframework.orm.hibernateX.support.OpenSessionInViewFilter'](http)的過濾器,您可以使用'FetchType.LAZY' ://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/hibernate3/support/OpenSessionInViewFilter.html)。它允許在Web視圖中延遲加載(如你所說,UI)。 – Lion

回答

0

在映射設置lazy="false" fetch="join"有效果,只有當你直接拿到你的實體:

session.get(Post.class, postId); 

當你做一個查詢時,你顯然需要聲明你的獲取策略。否則它仍然是懶惰的:

from Post as p left join fetch p.user 

像往常一樣,這個規則有很多變化和例外。您可以在Hibernate文檔中找到更多,16.3. Associations and joins