Hibernate中get()與load()不同點分析

      Hibernate中兩個極爲相似的方法Hibernate get()與Hibernate load(),他們都可以通過指定的實體類與ID從數據庫中讀取數據,並返回對應的實例,但Hibernate不會搞兩個完全一樣的方法的,它們間的不同在於:


◆如果找不到符合條件的紀錄,get()方法將返回null.而load()將會報出ObjectNotFoundEcception.

◆load()方法可以返回實體的代理類實例,而get()永遠只返回實體類.

◆load()方法可以充分利用二級緩存和內部緩存的現有數據,而get()方法只在內部緩存中進行查找,如沒有發現對應數據將跳過二級緩存,直接調用SQL完成查找.

 

Hibernate  get方法和Hibernate load方法的根本區別在於:如果你使用load方法,hibernate認爲該id對應的對象(數據庫記錄)在數據庫中是一定存在的,所以它可以放心的使用,它可以放心的使用代理來延遲加載該對象。在用到對象中的其他屬性數據時才查詢數據庫,但是萬一數據庫中不存在該記錄,那沒辦法,只能拋異常,所說的load方法拋異常是指在使用該對象的數據時,數據庫中不存在該數據時拋異常,而不是在創建這個對象時。由於session中的緩存對於hibernate來說是個相當廉價的資源,所以在load時會先查一下session緩存看看該id對應的對象是否存在,不存在則創建代理。所以如果你知道該id在數據庫中一定有對應記錄存在就可以使用load方法來實現延遲加載。
對於get方法,hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然後在二級緩存中查找,還沒有就查數據庫,數據庫中沒有就返回null。

發佈了38 篇原創文章 · 獲贊 0 · 訪問量 1958
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章