HHH-14029 Improve 2LC post-load event invocations

This commit is contained in:
Sanne Grinovero 2020-05-13 17:12:33 +01:00
parent 2eae22d1b9
commit a40ba7aff7
5 changed files with 28 additions and 14 deletions

View File

@ -45,6 +45,7 @@
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.id.factory.IdentifierGeneratorFactory;
import org.hibernate.internal.FastSessionServices;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.metadata.CollectionMetadata;
import org.hibernate.metamodel.spi.MetamodelImplementor;
@ -382,6 +383,11 @@ public Iterable<EntityNameResolver> iterateEntityNameResolvers() {
return delegate.iterateEntityNameResolvers();
}
@Override
public FastSessionServices getFastSessionServices() {
return delegate.getFastSessionServices();
}
@Override
public EntityPersister locateEntityPersister(Class byClass) {
return delegate.locateEntityPersister( byClass );

View File

@ -35,6 +35,7 @@
import org.hibernate.exception.spi.SQLExceptionConverter;
import org.hibernate.graph.spi.RootGraphImplementor;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.internal.FastSessionServices;
import org.hibernate.metamodel.spi.MetamodelImplementor;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
@ -176,6 +177,11 @@ default Iterable<EntityNameResolver> iterateEntityNameResolvers() {
return getMetamodel().getEntityNameResolvers();
}
/**
* @return the FastSessionServices instance associated with this SessionFactory
*/
FastSessionServices getFastSessionServices();
/**
* Contract for resolving this SessionFactory on deserialization
*/

View File

@ -32,6 +32,8 @@
import org.hibernate.event.spi.LockEventListener;
import org.hibernate.event.spi.MergeEventListener;
import org.hibernate.event.spi.PersistEventListener;
import org.hibernate.event.spi.PostLoadEvent;
import org.hibernate.event.spi.PostLoadEventListener;
import org.hibernate.event.spi.RefreshEventListener;
import org.hibernate.event.spi.ReplicateEventListener;
import org.hibernate.event.spi.ResolveNaturalIdEventListener;
@ -80,7 +82,7 @@
*
* @author Sanne Grinovero
*/
final class FastSessionServices {
public final class FastSessionServices {
/**
* Default session properties
@ -107,6 +109,9 @@ final class FastSessionServices {
final EventListenerGroup<SaveOrUpdateEventListener> eventListenerGroup_SAVE_UPDATE;
final EventListenerGroup<SaveOrUpdateEventListener> eventListenerGroup_UPDATE;
//Frequently used by 2LC initialization:
final EventListenerGroup<PostLoadEventListener> eventListenerGroup_POST_LOAD;
//Intentionally Package private:
final boolean disallowOutOfTransactionUpdateOperations;
final boolean useStreamForLobBinding;
@ -155,6 +160,7 @@ final class FastSessionServices {
this.eventListenerGroup_SAVE = listeners( eventListenerRegistry, EventType.SAVE );
this.eventListenerGroup_SAVE_UPDATE = listeners( eventListenerRegistry, EventType.SAVE_UPDATE );
this.eventListenerGroup_UPDATE = listeners( eventListenerRegistry, EventType.UPDATE );
this.eventListenerGroup_POST_LOAD = listeners( eventListenerRegistry, EventType.POST_LOAD );
//Other highly useful constants:
this.dialect = jdbcServices.getJdbcEnvironment().getDialect();
@ -285,4 +291,7 @@ public ConnectionObserverStatsBridge getDefaultJdbcObserver() {
return defaultJdbcObservers;
}
public void firePostLoadEvent(final PostLoadEvent postLoadEvent) {
eventListenerGroup_POST_LOAD.fireEventOnEachListener( postLoadEvent, PostLoadEventListener::onPostLoad );
}
}

View File

@ -1649,7 +1649,8 @@ private void logIfEmptyCompositesEnabled(Map<String, Object> props ) {
/**
* @return the FastSessionServices for this SessionFactory.
*/
FastSessionServices getFastSessionServices() {
@Override
public FastSessionServices getFastSessionServices() {
return this.fastSessionServices;
}

View File

@ -36,6 +36,7 @@
import org.hibernate.event.spi.PostLoadEventListener;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.FastSessionServices;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.pretty.MessageHelper;
import org.hibernate.proxy.HibernateProxy;
@ -354,22 +355,13 @@ private Object convertCacheEntryToEntity(
.setId( entityId )
.setPersister( persister );
for ( PostLoadEventListener listener : postLoadEventListeners( session ) ) {
listener.onPostLoad( postLoadEvent );
}
session.getSessionFactory()
.getFastSessionServices()
.firePostLoadEvent( postLoadEvent );
return entity;
}
private Iterable<PostLoadEventListener> postLoadEventListeners(EventSource session) {
return session
.getFactory()
.getServiceRegistry()
.getService( EventListenerRegistry.class )
.getEventListenerGroup( EventType.POST_LOAD )
.listeners();
}
public static class PersistenceContextEntry {
private final Object entity;
private EntityStatus status;