一些關於Hibernate延遲載入的誤區

2021-08-31 23:04:34 字數 1825 閱讀 9808

首先是第乙個誤區:延遲載入只能作用於關聯實體

看到這個是不是在想:非關聯實體延遲載入有什麼用?

為了解答上面這個問題,我們可以先考慮另乙個問題:hibernate session的get和load方法有什麼區別?

如果你的回答是:當方法引數為資料庫不存在的id時,get會返回null,load會丟擲異常,那麼恭喜你,進入了第二個誤區

如果此時你還想補充一下:load會從快取中取出資料而get不會,再次恭喜,進入第三個誤區

如果你在上面三個誤區中有乙個踏入了,那麼我敢打賭,你一定是被網上那些半吊子的工程師們寫的部落格給戕害了。。。。

此時是不是很憤怒?這些長久以來你牢記在心的hibernate的特性原來都是浮雲。。。。

呵呵,接下來我們乙個個來走出這些誤區。

mop上無圖無真相,我們這裡無碼無真相——不要誤會,我是說**

首先看看第二個誤區:當方法引數為資料庫不存在的id時,get會返回null,load會丟擲異常

如果你現在想說:沒錯啊,我自己就測試過,get確實返回了null,load確實丟擲了異常。

那麼請回答:load是在執行load語句時丟擲異常的嗎?為什麼?如果你答不上來,那麼接著看下面的**吧:

@test(expected = illegalargumentexception.class)

public void 延遲載入() throws exception catch (objectnotfoundexception ex)

tx.commit();

session.close();}

由這個test case我們可以知道load並不是在執行時就馬上丟擲不存在資料的異常的(objectnotfoundexception),這是為什麼呢?再看**:

@test(expected = illegalargumentexception.class)

public void 延遲載入() throws exception catch (objectnotfoundexception ex)

tx.commit();

session.close();}

看高亮的幾行,**已經把問題說得很清楚了,get和load最大的區別是(假設快取皆空的情況):get是立即命中資料庫去查詢這條記錄,而load則是直接返回乙個**物件(hibernateproxy)而不命中資料庫,換句話來說load是為單個物件進行了延遲載入,如果你不去訪問這個物件的除id外的屬性,即使目標記錄不存在它也永遠都不會丟擲異常。由於load不立即命中資料庫,它確實有一定機率提高效率

ok,我想上面一段話應該可以解釋第一和第二個誤區了,那麼第三個誤區呢?

再看**

@test

public void get和load一級快取測試() throws exception catch (objectnotfoundexception ex)

相信注釋已經足夠詳細了,開啟hibernate.show_sql,總共命中三次資料庫(執行sql),分別在高亮的三行處,其餘的全是從快取中取資料。

而且值得注意的一點是,如果物件是從load載入到快取中的,那麼不論get還是load獲取出來的都是乙個proxy,如果沒有被解開過,那麼get會嘗試解開它;如果物件是從get載入到快取中的,那麼load和get取出來都會是真實的實體物件。也就是說,get和load都會從快取中取出物件,且取出的物件總是保持其第一次載入時的狀態(load為proxy,get為真實物件)

以上**是一級快取的驗證,想驗證二級快取只需要從hibernate中開啟二級快取再次執行**即可

hibernate一些常見錯誤

1.出現該問題可能是在倆個多對多的實體類的對映配置檔案裡 錯將set的table配成了倆個實體類的表名,事實上應該設定為橋表的表名 2.出現該問題可能是在實體類的對映配置檔案裡 hibernate5.0 以後不需要建立服務註冊物件 serviceregistry 直接這樣建立 configurati...

一些VR延遲優化方法

vr中的 延遲 特指 motion to photon latency 指的是從使用者運動開始到相應畫面顯示到螢幕上所花的時間.這中間經過了大概這麼幾個步驟 感測器採集運動輸入資料 採集到的資料進行過濾並通過線纜傳輸到主機 遊戲引擎根據獲取的輸入資料更新邏輯和渲染視口 提交到驅動並由驅動傳送到顯示卡...

關於一些前言

作為乙個菜鳥程式設計師,還是有很多好處的,可以看著各種大神的 不管看不看得懂都可以好不吝嗇的誇揚一番,因為著實就本人個人技術而言還處在提公升與成長階段,雖然來公司實習也一年了,而如今正直畢業,總想找點事情做做,心中總想著不能放任自己肆無忌憚的玩下去,做點有意義的事情,然而每每不能定心。關於考勤系統的...