hibernate 得1+n問題

【問題】什麼時候會遇到N+1的問題?

【備註】 Hibernate默認抓取策略是fetch="select",不是fetch="join",這都是爲了延遲加載而準備的。

【出現情況】
         1)一對多(one-to-many) ,在1的這方,通過1條sql查找得到了1個對象,由於關聯的存在 ,那麼又需要將這個對象關聯的集合取出,所以合集數量是n還要發出n條sql,於是本來的1條sql查詢變成了    1 +n條 。
         2)多對一<many-to-one>  ,在多的這方,通過1條sql查詢得到了n個對象,由於關聯的存在,也會將這n個對象對應的1 方的對象取出, 於是本來的1條sql查詢變成了1 +n條 。


         3)iterator 查詢時,一定先去緩存中找(1條sql查集合,只查出ID),在沒命中時,會再按ID到庫中逐一查找, 產生1+n條SQL。




【解決辦法】

          1)lazy=true, hibernate3開始已經默認是lazy=true了;lazy=true時不會立刻查詢關聯對象,只有當需要關聯對象(訪問其屬性,非id字段)時纔會發生查詢動作。


          2)使用二級緩存, 二級緩存的應用將不怕1+N 問題,因爲即使第一次查詢很慢(未命中),以後查詢直接緩存命中也是很快的。剛好又利用了1+N 。


          3 ) 當然你也可以設定fetch="join",一次關聯表全查出來,但失去了延遲加載的特性。
發佈了153 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章