網上很多言論都說load會使用二級緩存而get不會,包括一些hibernate的教材上也這么寫的,但是以前在測試中發現,其實get也會使用二級緩存。
很久以前就發現了這個問題,一直沒騰出時間研究,今天特意看了下源碼(3.2.6.ga),確實如此
先看一下Session的默認實現SessionImpl
get方法會轉到fireLoad,loadType的值是LoadEventListener.GET
load方法也是轉到fireLoad,不同的是loadType的值是LoadEventListener.LOAD
- private void fireLoad(LoadEvent event, LoadType loadType) {
- errorIfClosed();
- checkTransactionSynchStatus();
- LoadEventListener[] loadEventListener = listeners.getLoadEventListeners();
- for ( int i = 0; i < loadEventListener.length; i++ ) {
- loadEventListener[i].onLoad(event, loadType);
- }
- }
調用loadEventListener的onLoad方法
LoadEventListener的默認實現DefaultLoadEventListener中
最終會轉到doLoad方法,options就是前面的loadType
- protected Object doLoad(
- final LoadEvent event,
- final EntityPersister persister,
- final EntityKey keyToLoad,
- final LoadEventListener.LoadType options) throws HibernateException {
- 。。。。。。
- Object entity = loadFromSessionCache( event, keyToLoad, options );//從一級緩存加載
- //如果不為空,直接返回
- 。。。。。。
- entity = loadFromSecondLevelCache(event, persister, options);//從二級緩存加載
- 。。。。。。
- }
loadFromSecondLevelCache即是從二級緩存中查找對象
get和load的區別在于LoadEventListener.LoadType options參數,一個是LoadEventListener.GET,一個是LoadEventListener.LOAD
而在這個方法中,并沒有用到options參數
也就是說get和load使用二級緩存的狀況是一樣的,get也會使用二級緩存
原文來自:http://snz.iteye.com/blog/305634