通过两天测试Spring、Hibernate 源代码,新发现HibernateTemplate在查询数据时,
- public class DefaultLoadEventListener extends AbstractLockUpgradeEventListener implements LoadEventListener{
- protected Object doLoad(
- final LoadEvent event,
- final EntityPersister persister,
- final EntityKey keyToLoad,
- final LoadEventListener.LoadType options) throws HibernateException {
- if ( log.isTraceEnabled() ) {
- log.trace(
- "attempting to resolve: " +
- MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() )
- );
- }
- Object entity = loadFromSessionCache( event, keyToLoad, options );
- if ( entity == REMOVED_ENTITY_MARKER ) {
- log.debug( "load request found matching entity in context, but it is scheduled for removal; returning null" );
- return null;
- }
- if ( entity == INCONSISTENT_RTN_CLASS_MARKER ) {
- log.debug( "load request found matching entity in context, but the matched entity was of an inconsistent return type; returning null" );
- return null;
- }
- if ( entity != null ) {
- if ( log.isTraceEnabled() ) {
- log.trace(
- "resolved object in session cache: " +
- MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() )
- );
- }
- return entity;
- }
- entity = loadFromSecondLevelCache(event, persister, options);
- if ( entity != null ) {
- if ( log.isTraceEnabled() ) {
- log.trace(
- "resolved object in second-level cache: " +
- MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() )
- );
- }
- return entity;
- }
- if ( log.isTraceEnabled() ) {
- log.trace(
- "object not resolved in any cache: " +
- MessageHelper.infoString( persister, event.getEntityId(), event.getSession().getFactory() )
- );
- }
- return loadFromDatasource(event, persister, keyToLoad, options);
- }
- }
1、首先从一级缓存中获取数据:loadFromSessionCache
2、二级缓存中获取数据:loadFromSecondLevelCache
3、从数据库中获取:loadFromDatasource
通过以上代码跟踪可以大致了解Hibernate读取数据过程。以前只是听说,这下可以近距离接触。
转载于:https://blog.51cto.com/xjmcs/459615