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對應的物件 資料庫記錄 在資料庫中是一定存在的,所以它可以放心的使用,...