Hibernate 1+N 問題

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

前提:Hibernate默認表與表的關聯方法是fetch="select",不是fetch="join",這都是爲了懶加載而準備的。


1)一對多(<set><list>) ,在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+N 問題?


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


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


3) 當然你也可以設定fetch="join",一次關聯表全查出來,但失去了懶加載的特性。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章