Hibernate (load PK get and list PK iterator )

首先介紹get()和load()方法的區別:web

get()方法和load()方法的區別主要在於對二級緩存的使用上。數據庫

load()方法會使用二級緩存,而get()方法在一級緩存沒有找到會直接查詢數據庫,不會去二級緩存中查找。緩存

get():若是在數據庫中沒有記錄會返回空,get()不管如何都會返回數據.spa

load():若是數據庫中沒有記錄會拋出異常,若是有數據返回的是一個代理對象。hibernate

get()方法默認不支持lazy(延遲加載)功能,而load支持延遲加載代理

get()方法在查詢不到數據時,返回null,而load由於支持延遲加載,只有在使用對象時才加載,因此若是數據庫中不存在在數據load會拋出異常(org.hibernate.ObjectNotFoundException)。orm

get()和load()只根據主鍵查詢,不能根據其它字段查詢,若是想根據非主鍵查詢,可使用HQL對象



list和iterator()方法之間的區別:(N+1?)內存

list()方法在執行時,直接運行查詢結果所須要的查詢語句。get

iterator()方法則是先執行獲得對象ID的查詢,而後在根據每一個ID值去取得所要查詢的對象。

所以:對於list()方式的查詢一般只會執行一個SQL語句,而對於iterator()方法的查詢則可能須要執行N+1條SQL語句(N爲結果集中的記錄數).

結果集的處理方法不一樣:

list()方法會一次活的全部的結果集對象,並且他會依據查詢的結果初始化全部的結果集對象。若是在結果集很是龐大的時候會佔據很是多的內存,甚至會形成內存溢出的狀況發生。

iterator()方法在執行時不會一次初始化全部的對象,而是根據對結果集的訪問狀況來初始化對象。一次在訪問中能夠控制緩存中對象的數量,以免佔用過多的緩存,致使內存溢出狀況的發生。

相關文章
相關標籤/搜索