20 Hibernate 1 N問題的原理與解決

2021-08-27 19:28:01 字數 657 閱讀 2419

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

前提:hibernate預設表與表的關聯方法是fetch="select",不是fetch="join",這都是為了懶載入而準備的。

1)一對多() ,在1的這方,通過1條sql查詢得到了1個物件,由於關聯的存在 ,那麼又需要將這個物件關聯的集合取出,所以合集數量是n還要發出n條sql,於是本來的1條sql查詢變成了1 +n條 。

2)多對一,在多的這方,通過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",一次關聯表全查出來,但失去了懶載入的特性。

Hibernate解決n 1問題

觀點 對於n 1問題的理解。一般而言說n 1意思是,無論在一對多還是多對一當查詢出n條資料之後,每條資料會關聯的查詢1次他的關聯物件,這就叫做n 1。但是我的理解是,本來所有資訊可以一次性查詢出來,也就是簡單的連表查詢,但是hibernate會首先查詢1次得到當前物件,然後當前物件裡面的n個關聯物件...

HIBERNATE的N 1查詢問題

在session的快取中存放的是相互關聯的物件圖。預設情況下,當hibernate從資料庫中載入customer物件時,會同時載入所有關聯的order物件。以customer和order類為例,假定orders表的customer id外來鍵允許為null,圖1列出了customers表和order...

hibernate中的n 1問題

前提 hibernate預設表與表的關聯方法是fetch select 不是fetch join 這都是為了懶載入而準備的。1 一對多 在1的這方,通過1條sql查詢得到了1個物件,由於關聯的存在 那麼又需要將這個物件關聯的集合取出,所以合集數量是n還要發出n條sql,於是本來的1條sql查詢變成了...