關於Hibernate中load與get的討論

2021-09-01 05:13:12 字數 1271 閱讀 2929

路人甲:

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

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

2.load()方法可以返回實體的**類例項,而get()永遠只返回實體類.

3.load()方法可以充分利用二級快取和內部快取的現有資料,而get()方法只在內部快取中進行查詢,如沒有發現對應資料將跳過二級快取,直接呼叫sql完成查詢.

路人乙:

呵呵,沒有說到根本點上,hibernate中get方法和load方法的根本區別在於:如果你使用load方法,hibernate認為該id對應的物件(資料庫記錄)在資料庫中是一定存在的,所以它可以放心的使用,它可以放心的使用**來延遲載入該物件。在用到物件中的其他屬性資料時才查詢資料庫,但是萬一資料庫中不存在該記錄,那沒辦法,只能拋異常,所說的load方法拋異常是指在使用該物件的資料時,資料庫中不存在該資料時拋異常,而不是在建立這個物件時。由於session中的快取對於hibernate來說是個相當廉價的資源,所以在load時會先查一下session快取看看該id對應的物件是否存在,不存在則建立**。所以如果你知道該id在資料庫中一定有對應記錄存在就可以使用load方法來實現延遲載入。

對於get方法,hibernate會確認一下該id對應的資料是否存在,首先在session快取中查詢,然後在二級快取中查詢,還沒有就查資料庫,資料庫中沒有就返回null。

對於第2點,雖然好多書中都這麼說:「get()永遠只返回實體類」,但實際上這是不正確的,get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被**過的,如被load方法使用過,或者被其他關聯物件延遲載入過,那麼返回的還是原先的**物件,而不是實體類物件,如果該**物件還沒有載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者資料庫來載入資料,但是返回的還是**物件,只不過已經載入了實體資料。

3。胡說八道,前面已經講了,get方法首先查詢session快取,沒有的話查詢二級快取,最後查詢資料庫;反而load方法建立時首先查詢session快取,沒有就建立**,實際使用資料時才查詢二級快取和資料庫。

總之對於get和load的根本區別,一句話,hibernate對於load方法認為該資料在資料庫中一定存在,可以放心的使用**來延遲載入,如果在使用過程中發現了問題,只能拋異常;而對於get方法,hibernate一定要獲取到真實的資料,否則返回null。

hibernate 關於 Clob使用

lob basic fetch fetchtype.eager column name s binfo columndefinition clob private clob sbinfo 抄來的是用string型別 能放進資料庫 然後 取出來 就報 對不上資料型別了 好吧 來個工具類 把clob 跟...

hibernate關於criteria多表查詢問題

在hibernate一對多查詢中關聯查詢的屬性查出來不會被封裝成乙個屬性 list list1 list gethibernatetemplate findbycriteria detachedcriteria,pagebean.getcurrentpage 1 pagebean.getpagesi...

關於Hibernate的使用

1 hibernate的原理 一定程度上簡化了jdbc的操作,實現了hql防止注入的功能 提供了dao的效率 2 hibernate的認知 中描述的是 我們在dao層寫 然後呼叫 將物件和sql傳入,然後開始執行 這個時候則會出發cfg檔案去建立sessionfactory,然後查詢對應的hbm檔案...