Hibernate原始碼解讀 查詢

2021-09-01 15:56:12 字數 2140 閱讀 8419

本文主要通過原始碼,概述一下session的查詢過程。

主要api有get、load。他們基本過程是類似的;

以get為例:

session

public object get(string entityname, serializable id) throws hibernateexception;

呼叫sessionimpl:

public object get(string entityname, serializable id) throws hibernateexception 

finally

}

fireload 主要是出發***;

主要獲取過程就是 event.getresult();

event為loadevent,其實是乙個很簡單的類,其getresult也是非常簡單,

public object getresult() 

public void setresult(object result)

其中result其實是由 fireload(event, loadeventlistener.get) 執行過程中賦值的

private void fireload(loadevent event, loadtype loadtype) 

}

當然,從這段**中我們仍然看不出什麼頭緒,我們繼續研究

loadeventlistener[i].onload(event, loadtype);

經查詢發現loadevent有乙個listener :defaultloadeventlistener

其onload方法主要呼叫

event.setresult( load(。。。。 ) ); 也就是 defaultloadeventlistener 的load方法,而其中主要又呼叫

object entity = doload(event, persister, keytoload, options); 來進行「查詢」:

protected object doload(

final loadevent event,

final entitypersister persister,

final entitykey keytoload,

final loadeventlistener.loadtype options)

throws hibernateexception

if ( entity != null )

//2entity = loadfromsecondlevelcache(event, persister, options);

if ( entity != null )

//3return loadfromdatasource(event, persister, keytoload, options);

}

去掉其中的注釋和logging部分,我們終於可以看到乙個比較明顯的語義了!!:::

1、loadfromsessioncache————從session快取中查詢, 如果找不到,則2

2、loadfromsecondlevelcache————從二級快取中查詢(如果支援),如果找不到,則3(即從sessionfactory查詢)

3、loadfromdatasource————仍然查詢不到,則從資料庫中查詢——這回是真正的查詢

loadfromsessioncache 關鍵:

object old = session.getentityusinginterceptor( keytoload );

loadfromsecondlevelcache關鍵:

object ce = persister.getcache().get( ck, source.gettimestamp() );

loadfromdatasource關鍵:

object entity = persister.load(

event.getentityid(),

event.getinstancetoload(),

event.getlockmode(),

source

);先寫到這裡,有時間再仔細看看。

openTLD 原始碼解讀

首先是run tld 在其次就是tldexample 最後到了初始化函式tldinit 第乙個比較關鍵的函式 bb scan 將影象網格化,將首先 scale 1.2.10 10 21 個規格 在每個規格上打網格 這個函式有乙個比較重要的方法 ntuples 就是重複 因為網格上的點很多點有相同的x...

thinkphp原始碼解讀

thinkphp原始碼解讀 thinkphp原始碼的根目錄下是 index.php,是系統預設的 主頁,index.php中首先檢測的是 php執行環境,如果php版本小於 5.3.0則退出執行,定義是否為除錯模式,定義應用目錄,引入入口檔案。thinkphp是整個框架的入口檔案,在thinkphp...

HashMap原始碼解讀

一 建立乙個hashmap都做了哪些工作?mapmap new hashmap hahmap無參構造方法 public hashmap 可以看到設定了載入因子 預設0.75 閾值 預設容量16 預設載入因子0.75 12 table是hashmap內部資料儲存結構entry陣列。當hashmap的s...