⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 defaultloadeventlistener.java

📁 一个Java持久层类库
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
					persister.getIdentifierType(),					persister.getRootEntityName(),					source.getEntityMode(),					source.getFactory()			);			lock = persister.getCacheAccessStrategy().lockItem( ck, null );		}		else {			ck = null;		}		Object entity;		try {			entity = load(event, persister, keyToLoad, options);		}		finally {			if ( persister.hasCache() ) {				persister.getCacheAccessStrategy().unlockItem( ck, lock );			}		}		return event.getSession().getPersistenceContext().proxyFor( persister, keyToLoad, entity );	}	/**	 * Coordinates the efforts to load a given entity.  First, an attempt is	 * made to load the entity from the session-level cache.  If not found there,	 * an attempt is made to locate it in second-level cache.  Lastly, an	 * attempt is made to load it directly from the datasource.	 *	 * @param event The load event	 * @param persister The persister for the entity being requested for load	 * @param keyToLoad The EntityKey representing the entity to be loaded.	 * @param options The load options.	 * @return The loaded entity, or null.	 */	protected Object doLoad(			final LoadEvent event,			final EntityPersister persister,			final EntityKey keyToLoad,			final LoadEventListener.LoadType options) {		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);	}	/**	 * Performs the process of loading an entity from the configured	 * underlying datasource.	 *	 * @param event The load event	 * @param persister The persister for the entity being requested for load	 * @param keyToLoad The EntityKey representing the entity to be loaded.	 * @param options The load options.	 * @return The object loaded from the datasource, or null if not found.	 */	protected Object loadFromDatasource(			final LoadEvent event,			final EntityPersister persister,			final EntityKey keyToLoad,			final LoadEventListener.LoadType options) {		final SessionImplementor source = event.getSession();		Object entity = persister.load(				event.getEntityId(),				event.getInstanceToLoad(),				event.getLockMode(),				source		);		if ( event.isAssociationFetch() && source.getFactory().getStatistics().isStatisticsEnabled() ) {			source.getFactory().getStatisticsImplementor().fetchEntity( event.getEntityClassName() );		}		return entity;	}	/**	 * Attempts to locate the entity in the session-level cache.	 * <p/>	 * If allowed to return nulls, then if the entity happens to be found in	 * the session cache, we check the entity type for proper handling	 * of entity hierarchies.	 * <p/>	 * If checkDeleted was set to true, then if the entity is found in the	 * session-level cache, it's current status within the session cache	 * is checked to see if it has previously been scheduled for deletion.	 *	 * @param event The load event	 * @param keyToLoad The EntityKey representing the entity to be loaded.	 * @param options The load options.	 * @return The entity from the session-level cache, or null.	 * @throws HibernateException Generally indicates problems applying a lock-mode.	 */	protected Object loadFromSessionCache(			final LoadEvent event,			final EntityKey keyToLoad,			final LoadEventListener.LoadType options) throws HibernateException {		SessionImplementor session = event.getSession();		Object old = session.getEntityUsingInterceptor( keyToLoad );		if ( old != null ) {			// this object was already loaded			EntityEntry oldEntry = session.getPersistenceContext().getEntry( old );			if ( options.isCheckDeleted() ) {				Status status = oldEntry.getStatus();				if ( status == Status.DELETED || status == Status.GONE ) {					return REMOVED_ENTITY_MARKER;				}			}			if ( options.isAllowNulls() ) {				EntityPersister persister = event.getSession().getFactory().getEntityPersister( event.getEntityClassName() );				if ( ! persister.isInstance( old, event.getSession().getEntityMode() ) ) {					return INCONSISTENT_RTN_CLASS_MARKER;				}			}			upgradeLock( old, oldEntry, event.getLockMode(), session );		}		return old;	}	/**	 * Attempts to load the entity from the second-level cache.	 *	 * @param event The load event	 * @param persister The persister for the entity being requested for load	 * @param options The load options.	 * @return The entity from the second-level cache, or null.	 */	protected Object loadFromSecondLevelCache(			final LoadEvent event,			final EntityPersister persister,			final LoadEventListener.LoadType options) {		final SessionImplementor source = event.getSession();		final boolean useCache = persister.hasCache()				&& source.getCacheMode().isGetEnabled()				&& event.getLockMode().lessThan(LockMode.READ);		if ( useCache ) {			final SessionFactoryImplementor factory = source.getFactory();			final CacheKey ck = new CacheKey(					event.getEntityId(),					persister.getIdentifierType(),					persister.getRootEntityName(),					source.getEntityMode(),					source.getFactory()			);			Object ce = persister.getCacheAccessStrategy().get( ck, source.getTimestamp() );			if ( factory.getStatistics().isStatisticsEnabled() ) {				if ( ce == null ) {					factory.getStatisticsImplementor().secondLevelCacheMiss(							persister.getCacheAccessStrategy().getRegion().getName()					);				}				else {					factory.getStatisticsImplementor().secondLevelCacheHit(							persister.getCacheAccessStrategy().getRegion().getName()					);				}			}			if ( ce != null ) {				CacheEntry entry = (CacheEntry) persister.getCacheEntryStructure().destructure( ce, factory );				// Entity was found in second-level cache...				return assembleCacheEntry(						entry,						event.getEntityId(),						persister,						event				);			}		}		return null;	}	private Object assembleCacheEntry(			final CacheEntry entry,			final Serializable id,			final EntityPersister persister,			final LoadEvent event) throws HibernateException {		final Object optionalObject = event.getInstanceToLoad();		final EventSource session = event.getSession();		final SessionFactoryImplementor factory = session.getFactory();		if ( log.isTraceEnabled() ) {			log.trace(					"assembling entity from second-level cache: " +					MessageHelper.infoString( persister, id, factory )				);		}		EntityPersister subclassPersister = factory.getEntityPersister( entry.getSubclass() );		Object result = optionalObject == null ?				session.instantiate( subclassPersister, id ) : optionalObject;		// make it circular-reference safe		TwoPhaseLoad.addUninitializedCachedEntity(				new EntityKey( id, subclassPersister, session.getEntityMode() ),				result,				subclassPersister,				LockMode.NONE,				entry.areLazyPropertiesUnfetched(),				entry.getVersion(),				session			);		Type[] types = subclassPersister.getPropertyTypes();		Object[] values = entry.assemble( result, id, subclassPersister, session.getInterceptor(), session ); // intializes result by side-effect		TypeFactory.deepCopy(				values,				types,				subclassPersister.getPropertyUpdateability(),				values,				session			);		Object version = Versioning.getVersion( values, subclassPersister );		if ( log.isTraceEnabled() ) log.trace( "Cached Version: " + version );		final PersistenceContext persistenceContext = session.getPersistenceContext();		persistenceContext.addEntry(				result,				Status.MANAGED,				values,				null,				id,				version,				LockMode.NONE,				true,				subclassPersister,				false,				entry.areLazyPropertiesUnfetched()			);		subclassPersister.afterInitialize( result, entry.areLazyPropertiesUnfetched(), session );		persistenceContext.initializeNonLazyCollections();		// upgrade the lock if necessary:		//lock(result, lockMode);		//PostLoad is needed for EJB3		//TODO: reuse the PostLoadEvent...		PostLoadEvent postLoadEvent = new PostLoadEvent(session).setEntity(result)				.setId(id).setPersister(persister);		PostLoadEventListener[] listeners = session.getListeners().getPostLoadEventListeners();		for ( int i = 0; i < listeners.length; i++ ) {			listeners[i].onPostLoad(postLoadEvent);		}		return result;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -