通过两天测试Spring、Hibernate 源代码,新发现HibernateTemplate在查询数据时,

 


 
  
  1. public class DefaultLoadEventListener extends AbstractLockUpgradeEventListener implements LoadEventListener{ 
  2.  
  3. protected Object doLoad( 
  4.             final LoadEvent event, 
  5.             final EntityPersister persister, 
  6.             final EntityKey keyToLoad, 
  7.             final LoadEventListener.LoadType options) throws HibernateException { 
  8.          
  9.         if ( log.isTraceEnabled() ) { 
  10.             log.trace( 
  11.                     "attempting to resolve: " +  
  12.                     MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() ) 
  13.                 ); 
  14.         } 
  15.  
  16.         Object entity = loadFromSessionCache( event, keyToLoad, options ); 
  17.         if ( entity == REMOVED_ENTITY_MARKER ) { 
  18.             log.debug( "load request found matching entity in context, but it is scheduled for removal; returning null" ); 
  19.             return null; 
  20.         } 
  21.         if ( entity == INCONSISTENT_RTN_CLASS_MARKER ) { 
  22.             log.debug( "load request found matching entity in context, but the matched entity was of an inconsistent return type; returning null" ); 
  23.             return null; 
  24.         } 
  25.         if ( entity != null ) { 
  26.             if ( log.isTraceEnabled() ) { 
  27.                 log.trace( 
  28.                         "resolved object in session cache: " + 
  29.                         MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory()  ) 
  30.                     ); 
  31.             } 
  32.             return entity; 
  33.         } 
  34.  
  35.         entity = loadFromSecondLevelCache(event, persister, options); 
  36.         if ( entity != null ) { 
  37.             if ( log.isTraceEnabled() ) { 
  38.                 log.trace( 
  39.                         "resolved object in second-level cache: " + 
  40.                         MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() ) 
  41.                     ); 
  42.             } 
  43.             return entity; 
  44.         } 
  45.  
  46.         if ( log.isTraceEnabled() ) { 
  47.             log.trace( 
  48.                     "object not resolved in any cache: " + 
  49.                     MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() ) 
  50.                 ); 
  51.         } 
  52.  
  53.         return loadFromDatasource(event, persister, keyToLoad, options); 
  54.     } 

 

1、首先从一级缓存中获取数据:loadFromSessionCache

2、二级缓存中获取数据:loadFromSecondLevelCache

3、从数据库中获取:loadFromDatasource

通过以上代码跟踪可以大致了解Hibernate读取数据过程。以前只是听说,这下可以近距离接触。