session.load/get方法均可以根據指定的實體類和id從資料庫讀取記錄,並返回與之對應的實體物件。其區別在於:
如果未能發現符合條件的記錄,get方法返回null,而load方法會丟擲乙個objectnotfoundexception。
load方法可返回實體的**類例項,而get方法永遠直接返回實體類。
load方法可以充分利用內部快取和二級快取中的現有資料,而get方法則僅僅在內部快取中進行資料查詢,如沒有發現對應資料,將越過二級快取,直接呼叫sql完成資料讀取。
session在載入實體物件時,將經過的過程:
首先,hibernate中維持了兩級快取。第一級快取由session例項維護,其中保持了session當前所有關聯實體的資料,也稱為內部快取。而第二級快取則存在於sessionfactory層次,由當前所有由本sessionfactory構造的session例項共享。出於效能考慮,避免無謂的資料庫訪問,session在呼叫資料庫查詢功能之前,會先在快取中進行查詢。首先在第一級快取中,通過實體型別和id進行查詢,如果第一級快取查詢命中,且資料狀態合法,則直接返回。
之後,session會在當前「nonexists」記錄中進行查詢,如果「nonexists」記錄中存在同樣的查詢條件,則返回null。「nonexists」記錄了當前session例項在之前所有查詢操作中,未能查詢到有效資料的查詢條件(相當於乙個查詢黑名單列表)。如此一來,如果session中乙個無效的查詢條件重複出現,即可迅速作出判斷,從而獲得最佳的效能表現。
對於load方法而言,如果內部快取中未發現有效資料,則查詢第二級快取,如果第二級快取命中,則返回。
如在快取中未發現有效資料,則發起資料庫查詢操作(select sql),如經過查詢未發現對應記錄,則將此次查詢的資訊在「nonexists」中加以記錄,並返回null。
根據對映配置和select sql得到的resultset,建立對應的資料物件。
將其資料物件納入當前session實體管理容器(一級快取)。
執行interceptor.onload方法(如果有對應的interceptor)。
將資料物件納入二級快取。
如果資料物件實現了lifecycle介面,則呼叫資料物件的onload方法。
返回資料物件。
hibernate 資料載入
color red hibernate資料載入方式 color 1 即時載入 immediate loading 當實體載入完成後,立即載入與實體相關聯的資料。即當實體載入完成後,hibernate自動立即讀取與實體相關聯的資料,並且填充到實體對應的屬性中。這種載入通常有多條select語句,即se...
Hibernate裝載物件 LOAD 與GET
區別1 如果資料庫中,沒有userid的物件。如果通過get方法載入,則返回的是乙個null 如果通過load載入,則返回乙個 物件,如果後面 如果呼叫user物件的某個屬性 比如user.getpassword 會丟擲異常 org.hibernate.objectnotfoundexception...
hibernate資料載入get load的區別
session.load get方法均可以根據指定的實體類和id從資料庫讀取記錄,並返回與之對應的實體物件。其區別在於 如果未能發現符合條件的記錄,get方法返回null,而load方法會丟擲乙個objectnotfoundexception。load方法可返回實體的 類例項,而get方法永遠直接返...