hibernate get和load方法異同

2021-12-29 21:08:05 字數 1287 閱讀 3505

load和get一共是2個區別 先講第乙個 延遲載入

load是true而get是false

意思就是 load採用的是延遲載入的方式 而get不是,hibernate思想是 既然這個方法支援延遲載入 他就認為這個物件一定在資料庫存在,在你宣告 tfaq tfag2=(tfaq)sess.load(tfaq.class, 300); 這句時候,hibernate就幹了一件事

1.查詢session快取

2.快取中沒有這個物件 就建立個**

因為延遲載入需要**來執行 所以就建立了個**

ok 到此為止 這句話就幹了個這個 並沒有去資料庫互動查詢

當你使用這個物件 比如tfag2.gettfrtitle()或get方法時候

這個時候 hibernate就去查詢二級快取和資料庫,資料庫沒有這條資料 就丟擲異常

整個load方法呼叫結束 load沒什麼神奇 這就是他幹過所有的事情

load方法講完了 我在講一下get方法工作原理

因為hibernate規定get方法不能使用延遲載入 所以和load還是不一樣的

tfaq tfag2=(tfaq)sess.get(tfaq.class, 300);

在建立這條語句時候 我們看看hibernate幹了哪些事

1.get方法首先查詢session快取 (session快取就是hibernate的一級快取 這個概念大家應該清楚吧 )

2.get方法如果在session快取中找到了該id對應的物件,如果剛好該物件前面是被**過的,如被load方法使用過,或者被其他關聯物件延遲載入過,那麼返回的還是原先的**物件,而不是實體類物件。

3.如果該**物件還沒有載入實體資料(就是id以外的其他屬性資料),那麼它會查詢二級快取或者資料庫來載入資料,但是返回的還是**物件,只不過已經載入了實體資料。www.2cto.com

(這個**實際就是空的物件 並沒有去資料庫查詢得到的 我們叫**物件,如果 去資料庫查詢了 返回到了這個物件 我們叫實體物件 就是這個物件真實存在)

我在總結性一句話這2者區別

get方法首先查詢session快取,沒有的話查詢二級快取,最後查詢資料庫;反而load方法建立時首先查詢session快取,沒有就建立**,實際使用資料時才查詢二級快取和資料庫

(1)如果你想載入乙個物件使用它的屬性,該使用get方法,get方法的到的資料時實體物件裡的資料

(2)如果想對乙個物件進行增刪改查之類,該使用load方法,效能提高,可以使用**物件,省去了一次和資料庫互動的機會,當真正用到該物件的屬性時,才跟資料庫互動。

作者:oh_mourinho

lockInterruptibly和lock的區別

size medium lock 拿不到lock就不罷休,不然執行緒就一直block。lockinterruptibly會優先響應執行緒中斷,處理響應的方式是丟擲interruptedexception。size 可以從原始碼看出來的 private void doacquireinterrupti...

Hibernate get和load方法區別

get和load方式是根據id取得乙個記錄 下邊詳細說一下get和load的不同,因為有些時候為了對比也會把find加進來。color red b 1.從返回結果上對比 b color load方式檢索不到的話會丟擲org.hibernate.objectnotfoundexception異常 ge...

Hibernate get與load的區別

hibernate 中有兩個極為相似的方法get 與load 他們都可以通過指定的實體類與id從資料庫中讀取資料,並返回對應的例項,但hibernate 不會搞兩個完全一樣的方法的,它們間的不同在於 hibernate 認為該id對應的物件 資料庫記錄 在資料庫中是一定存在的,所以它可以放心的使用,...