diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/generator/values/internal/ReactiveGeneratedValuesHelper.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/generator/values/internal/ReactiveGeneratedValuesHelper.java index 70495ccea..33126094d 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/generator/values/internal/ReactiveGeneratedValuesHelper.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/generator/values/internal/ReactiveGeneratedValuesHelper.java @@ -48,7 +48,7 @@ import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions; import org.hibernate.type.descriptor.WrapperOptions; -import static org.hibernate.generator.internal.NaturalIdHelper.getNaturalIdPropertyNames; +import static org.hibernate.internal.NaturalIdHelper.getNaturalIdPropertyNames; import static org.hibernate.generator.values.internal.GeneratedValuesHelper.noCustomSql; import static org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer.UniqueSemantic.NONE; diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveAbstractMultiIdEntityLoader.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveAbstractMultiIdEntityLoader.java index 527d59326..71ae6e7e7 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveAbstractMultiIdEntityLoader.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveAbstractMultiIdEntityLoader.java @@ -10,7 +10,7 @@ import java.util.concurrent.CompletionStage; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.event.spi.EventSource; +import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.loader.ast.spi.MultiIdLoadOptions; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityMappingType; @@ -50,7 +50,7 @@ public EntityMappingType getLoadable() { } @Override - public final CompletionStage> reactiveLoad(K[] ids, MultiIdLoadOptions loadOptions, EventSource session) { + public final CompletionStage> reactiveLoad(K[] ids, MultiIdLoadOptions loadOptions, SharedSessionContractImplementor session) { Objects.requireNonNull( ids ); return loadOptions.isOrderReturnEnabled() @@ -58,8 +58,8 @@ public final CompletionStage> reactiveLoad(K[] ids, MultiIdLoadOptio : performUnorderedMultiLoad( ids, loadOptions, session ); } - protected abstract CompletionStage> performOrderedMultiLoad(K[] ids, MultiIdLoadOptions loadOptions, EventSource session); + protected abstract CompletionStage> performOrderedMultiLoad(K[] ids, MultiIdLoadOptions loadOptions, SharedSessionContractImplementor session); - protected abstract CompletionStage> performUnorderedMultiLoad(K[] ids, MultiIdLoadOptions loadOptions, EventSource session); + protected abstract CompletionStage> performUnorderedMultiLoad(K[] ids, MultiIdLoadOptions loadOptions, SharedSessionContractImplementor session); } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveMultiIdEntityLoaderArrayParam.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveMultiIdEntityLoaderArrayParam.java index 8239a6e15..612e5ad16 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveMultiIdEntityLoaderArrayParam.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveMultiIdEntityLoaderArrayParam.java @@ -18,8 +18,8 @@ import org.hibernate.engine.spi.EntityKey; import org.hibernate.engine.spi.PersistenceContext; import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.spi.SubselectFetch; -import org.hibernate.event.spi.EventSource; import org.hibernate.loader.ast.internal.LoaderSelectBuilder; import org.hibernate.loader.ast.internal.MultiIdEntityLoaderArrayParam; import org.hibernate.loader.ast.internal.MultiKeyLoadLogging; @@ -82,7 +82,7 @@ public BasicEntityIdentifierMapping getIdentifierMapping() { protected CompletionStage> performOrderedMultiLoad( K[] ids, MultiIdLoadOptions loadOptions, - EventSource session) { + SharedSessionContractImplementor session) { if ( MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER.isTraceEnabled() ) { MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER.tracef( "ReactiveMultiIdEntityLoaderArrayParam#performOrderedMultiLoad - %s", @@ -227,7 +227,7 @@ protected CompletionStage> performOrderedMultiLoad( protected CompletionStage> performUnorderedMultiLoad( K[] ids, MultiIdLoadOptions loadOptions, - EventSource session) { + SharedSessionContractImplementor session) { if ( MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER.isTraceEnabled() ) { MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER.tracef( "ReactiveMultiIdEntityLoaderArrayParam#performUnorderedMultiLoad - %s", @@ -305,7 +305,7 @@ protected final K[] processResolvableEntities( MultiIdEntityLoaderArrayParam.ResolutionConsumer resolutionConsumer, MultiIdLoadOptions loadOptions, LockOptions lockOptions, - EventSource session) { + SharedSessionContractImplementor session) { if ( !loadOptions.isSessionCheckingEnabled() && !loadOptions.isSecondLevelCacheCheckingEnabled() ) { // we'll load all of them from the database diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveMultiIdEntityLoaderStandard.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveMultiIdEntityLoaderStandard.java index 92f4e996a..743078403 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveMultiIdEntityLoaderStandard.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveMultiIdEntityLoaderStandard.java @@ -24,7 +24,6 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.engine.spi.SubselectFetch; -import org.hibernate.event.spi.EventSource; import org.hibernate.internal.util.collections.CollectionHelper; import org.hibernate.loader.ast.internal.LoaderSelectBuilder; import org.hibernate.loader.ast.spi.MultiIdLoadOptions; @@ -75,7 +74,7 @@ public ReactiveMultiIdEntityLoaderStandard( protected CompletionStage> performOrderedMultiLoad( Object[] ids, MultiIdLoadOptions loadOptions, - EventSource session) { + SharedSessionContractImplementor session) { if ( LOG.isTraceEnabled() ) { LOG.tracef( "#performOrderedMultiLoad(`%s`, ..)", getEntityDescriptor().getEntityName() ); } @@ -289,7 +288,7 @@ private static List singletonList(Object loaded) { protected CompletionStage> performUnorderedMultiLoad( Object[] ids, MultiIdLoadOptions loadOptions, - EventSource session) { + SharedSessionContractImplementor session) { assert !loadOptions.isOrderReturnEnabled(); assert ids != null; diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveSingleIdEntityLoaderStandardImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveSingleIdEntityLoaderStandardImpl.java index 684894cf2..3882b8d7e 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveSingleIdEntityLoaderStandardImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/internal/ReactiveSingleIdEntityLoaderStandardImpl.java @@ -53,11 +53,9 @@ public CompletionStage load( LockOptions lockOptions, Boolean readOnly, SharedSessionContractImplementor session) { - final ReactiveSingleIdLoadPlan loadPlan = (ReactiveSingleIdLoadPlan) resolveLoadPlan( - lockOptions, - session.getLoadQueryInfluencers(), - session.getFactory() - ); + final ReactiveSingleIdLoadPlan loadPlan = + (ReactiveSingleIdLoadPlan) + resolveLoadPlan( lockOptions, session.getLoadQueryInfluencers() ); return loadPlan.load( key, readOnly, true, session ); } @@ -68,7 +66,9 @@ public CompletionStage load( LockOptions lockOptions, Boolean readOnly, SharedSessionContractImplementor session) { - final ReactiveSingleIdLoadPlan loadPlan = (ReactiveSingleIdLoadPlan) resolveLoadPlan( lockOptions, session.getLoadQueryInfluencers(), session.getFactory() ); + final ReactiveSingleIdLoadPlan loadPlan = + (ReactiveSingleIdLoadPlan) + resolveLoadPlan( lockOptions, session.getLoadQueryInfluencers() ); return loadPlan.load( key, entityInstance, readOnly, false, session ); } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/spi/ReactiveMultiIdEntityLoader.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/spi/ReactiveMultiIdEntityLoader.java index 47050b139..e0236e361 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/spi/ReactiveMultiIdEntityLoader.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/loader/ast/spi/ReactiveMultiIdEntityLoader.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.concurrent.CompletionStage; -import org.hibernate.event.spi.EventSource; +import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.loader.ast.spi.MultiIdEntityLoader; import org.hibernate.loader.ast.spi.MultiIdLoadOptions; import org.hibernate.reactive.logging.impl.Log; @@ -22,9 +22,9 @@ public interface ReactiveMultiIdEntityLoader extends MultiIdEntityLoader { @Override - default List load(K[] ids, MultiIdLoadOptions options, EventSource session) { + default List load(K[] ids, MultiIdLoadOptions options, SharedSessionContractImplementor session) { throw make( Log.class, lookup() ).nonReactiveMethodCall( "reactiveLoad" ); } - CompletionStage> reactiveLoad(K[] ids, MultiIdLoadOptions options, EventSource session); + CompletionStage> reactiveLoad(K[] ids, MultiIdLoadOptions options, SharedSessionContractImplementor session); } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveAbstractPersisterDelegate.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveAbstractPersisterDelegate.java index 9a31d2bc8..c5d068db7 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveAbstractPersisterDelegate.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveAbstractPersisterDelegate.java @@ -20,11 +20,11 @@ import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.event.spi.EventSource; import org.hibernate.generator.Generator; import org.hibernate.generator.values.GeneratedValues; import org.hibernate.id.IdentityGenerator; import org.hibernate.loader.ast.spi.BatchLoaderFactory; +import org.hibernate.loader.ast.spi.EntityBatchLoader; import org.hibernate.loader.ast.spi.MultiIdLoadOptions; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Property; @@ -81,11 +81,11 @@ public class ReactiveAbstractPersisterDelegate { private static final Log LOG = LoggerFactory.make( Log.class, MethodHandles.lookup() ); - private final Supplier> singleIdEntityLoaderSupplier; - private final Supplier> multiIdEntityLoaderSupplier; + private final Supplier> singleIdEntityLoaderSupplier; + private final Supplier> multiIdEntityLoaderSupplier; - private ReactiveSingleIdEntityLoader singleIdEntityLoader; - private ReactiveMultiIdEntityLoader multiIdEntityLoader; + private ReactiveSingleIdEntityLoader singleIdEntityLoader; + private ReactiveMultiIdEntityLoader multiIdEntityLoader; private final EntityPersister entityDescriptor; @@ -101,12 +101,12 @@ public ReactiveAbstractPersisterDelegate( entityDescriptor = entityPersister; } - public ReactiveSingleIdEntityLoader buildSingleIdEntityLoader() { + public ReactiveSingleIdEntityLoader buildSingleIdEntityLoader() { singleIdEntityLoader = singleIdEntityLoaderSupplier.get(); return singleIdEntityLoader; } - public ReactiveMultiIdEntityLoader buildMultiIdEntityLoader() { + public ReactiveMultiIdEntityLoader buildMultiIdEntityLoader() { multiIdEntityLoader = multiIdEntityLoaderSupplier.get(); return multiIdEntityLoader; } @@ -126,7 +126,7 @@ public DomainResult createDomainResult( /** * @see org.hibernate.persister.entity.AbstractEntityPersister#multiLoad(Object[], EventSource, MultiIdLoadOptions)` */ - public CompletionStage> multiLoad(K[] ids, EventSource session, MultiIdLoadOptions loadOptions) { + public CompletionStage> multiLoad(K[] ids, SharedSessionContractImplementor session, MultiIdLoadOptions loadOptions) { return multiIdEntityLoader.reactiveLoad( ids, loadOptions, session ); } @@ -135,12 +135,12 @@ private static ReactiveMultiIdEntityLoader buildMultiIdEntityLoader( PersistentClass persistentClass, SessionFactoryImplementor factory) { return entityDescriptor.getIdentifierType() instanceof BasicType - && supportsSqlArrayType( factory.getJdbcServices().getDialect() ) + && supportsSqlArrayType( factory.getJdbcServices().getDialect() ) ? new ReactiveMultiIdEntityLoaderArrayParam<>( entityDescriptor, factory ) : new ReactiveMultiIdEntityLoaderStandard<>( entityDescriptor, persistentClass, factory ); } - private static ReactiveSingleIdEntityLoader buildSingleIdEntityLoader( + private static ReactiveSingleIdEntityLoader buildSingleIdEntityLoader( EntityPersister entityDescriptor, PersistentClass bootDescriptor, RuntimeModelCreationContext creationContext, @@ -148,32 +148,45 @@ private static ReactiveSingleIdEntityLoader buildSingleIdEntityLoader( String entityName) { if ( bootDescriptor.getLoaderName() != null ) { // We must resolve the named query on-demand through the boot model because it isn't initialized yet - final NamedQueryMemento namedQueryMemento = factory.getQueryEngine().getNamedObjectRepository() - .resolve( factory, creationContext.getBootModel(), bootDescriptor.getLoaderName() ); - if ( namedQueryMemento == null ) { - throw new IllegalArgumentException( "Could not resolve named load-query [" + entityName + "] : " + bootDescriptor.getLoaderName() ); - } + final NamedQueryMemento namedQueryMemento = + getNamedQueryMemento( bootDescriptor, creationContext, factory, entityName ); return new ReactiveSingleIdEntityLoaderProvidedQueryImpl<>( entityDescriptor, namedQueryMemento ); } - - LoadQueryInfluencers loadQueryInfluencers = new LoadQueryInfluencers( factory ); - if ( loadQueryInfluencers.effectivelyBatchLoadable( entityDescriptor ) ) { - final int batchSize = loadQueryInfluencers.effectiveBatchSize( entityDescriptor ); - if ( batchSize > 1 ) { + else { + final LoadQueryInfluencers loadQueryInfluencers = new LoadQueryInfluencers( factory ); + if ( loadQueryInfluencers.effectivelyBatchLoadable( entityDescriptor ) ) { + final int batchSize = loadQueryInfluencers.effectiveBatchSize( entityDescriptor ); return createBatchingIdEntityLoader( entityDescriptor, batchSize, factory ); } + else { + return new ReactiveSingleIdEntityLoaderStandardImpl<>( entityDescriptor, loadQueryInfluencers ); + } } + } - return new ReactiveSingleIdEntityLoaderStandardImpl<>( entityDescriptor, new LoadQueryInfluencers( factory ) ); + private static NamedQueryMemento getNamedQueryMemento( + PersistentClass bootDescriptor, + RuntimeModelCreationContext creationContext, + SessionFactoryImplementor factory, + String entityName) { + final NamedQueryMemento namedQueryMemento = + factory.getQueryEngine().getNamedObjectRepository() + .resolve(factory, creationContext.getBootModel(), bootDescriptor.getLoaderName() ); + if ( namedQueryMemento == null ) { + throw new IllegalArgumentException( "Could not resolve named query '" + bootDescriptor.getLoaderName() + + "' for loading entity '" + entityName + "'" ); + } + return namedQueryMemento; } - private static ReactiveSingleIdEntityLoader createBatchingIdEntityLoader( + private static ReactiveSingleIdEntityLoader createBatchingIdEntityLoader( EntityMappingType entityDescriptor, int domainBatchSize, SessionFactoryImplementor factory) { - return (ReactiveSingleIdEntityLoader) factory.getServiceRegistry() - .getService( BatchLoaderFactory.class ) - .createEntityBatchLoader( domainBatchSize, entityDescriptor, factory ); + final EntityBatchLoader batchLoader = + factory.getServiceRegistry().requireService( BatchLoaderFactory.class ) + .createEntityBatchLoader( domainBatchSize, entityDescriptor, factory ); + return (ReactiveSingleIdEntityLoader) batchLoader; } public CompletionStage processInsertGeneratedProperties( @@ -236,7 +249,7 @@ protected ReactiveSingleUniqueKeyEntityLoader getReactiveUniqueKeyLoader ); } - public CompletionStage load( + public CompletionStage load( EntityPersister persister, Object id, Object optionalObject, @@ -255,7 +268,7 @@ public Generator reactive(Generator generator) { return generator instanceof IdentityGenerator ? new ReactiveIdentityGenerator() : generator; } - public CompletionStage loadEntityIdByNaturalId( + public CompletionStage loadEntityIdByNaturalId( Object[] orderedNaturalIdValues, LockOptions lockOptions, SharedSessionContractImplementor session) { if ( LOG.isTraceEnabled() ) { LOG.tracef( "Resolving natural-id [%s] to id : %s ", @@ -264,7 +277,7 @@ public CompletionStage loadEntityIdByNaturalId( ); } - return ( (ReactiveNaturalIdLoader) entityDescriptor.getNaturalIdLoader() ) + return ( (ReactiveNaturalIdLoader) entityDescriptor.getNaturalIdLoader() ) .resolveNaturalIdToId( orderedNaturalIdValues, session ); } @@ -323,13 +336,15 @@ public AttributeMapping buildPluralAttributeMapping( } public EntityIdentifierMapping convertEntityIdentifierMapping(EntityIdentifierMapping entityIdentifierMapping) { - if ( entityIdentifierMapping instanceof NonAggregatedIdentifierMappingImpl ) { - return new ReactiveNonAggregatedIdentifierMappingImpl( (NonAggregatedIdentifierMappingImpl) entityIdentifierMapping ); + if ( entityIdentifierMapping instanceof NonAggregatedIdentifierMappingImpl nonAggregatedIdentifierMapping ) { + return new ReactiveNonAggregatedIdentifierMappingImpl(nonAggregatedIdentifierMapping); + } + else if ( entityIdentifierMapping instanceof EmbeddedIdentifierMappingImpl embeddedIdentifierMapping ) { + return new ReactiveEmbeddedIdentifierMappingImpl(embeddedIdentifierMapping); } - if ( entityIdentifierMapping instanceof EmbeddedIdentifierMappingImpl ) { - return new ReactiveEmbeddedIdentifierMappingImpl( (EmbeddedIdentifierMappingImpl) entityIdentifierMapping ); + else { + return entityIdentifierMapping; } - return entityIdentifierMapping; } private static class ReactiveNonAggregatedIdentifierMappingImpl extends NonAggregatedIdentifierMappingImpl { diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveEntityPersister.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveEntityPersister.java index 0a36d048d..16d6237f2 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveEntityPersister.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveEntityPersister.java @@ -12,7 +12,6 @@ import org.hibernate.LockOptions; import org.hibernate.bytecode.BytecodeLogging; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.event.spi.EventSource; import org.hibernate.generator.values.GeneratedValues; import org.hibernate.loader.ast.spi.MultiIdLoadOptions; import org.hibernate.persister.entity.EntityPersister; @@ -92,40 +91,40 @@ CompletionStage reactiveLock( CompletionStage> reactiveMultiLoad( K[] ids, - EventSource session, + SharedSessionContractImplementor session, MultiIdLoadOptions loadOptions); - CompletionStage reactiveLoad( + CompletionStage reactiveLoad( Object id, Object optionalObject, LockMode lockMode, SharedSessionContractImplementor session); - CompletionStage reactiveLoad( + CompletionStage reactiveLoad( Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session); - CompletionStage reactiveLoad( + CompletionStage reactiveLoad( Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session, Boolean readOnly); - CompletionStage reactiveLoadByUniqueKey( + CompletionStage reactiveLoadByUniqueKey( String propertyName, Object uniqueKey, SharedSessionContractImplementor session); - CompletionStage reactiveLoadByUniqueKey( + CompletionStage reactiveLoadByUniqueKey( String propertyName, Object uniqueKey, Boolean readOnly, SharedSessionContractImplementor session); - CompletionStage reactiveLoadEntityIdByNaturalId( + CompletionStage reactiveLoadEntityIdByNaturalId( Object[] naturalIdValues, LockOptions lockOptions, SharedSessionContractImplementor session); diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveJoinedSubclassEntityPersister.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveJoinedSubclassEntityPersister.java index b87ba6910..0182ef403 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveJoinedSubclassEntityPersister.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveJoinedSubclassEntityPersister.java @@ -17,7 +17,6 @@ import org.hibernate.engine.spi.CascadeStyle; import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.event.spi.EventSource; import org.hibernate.generator.Generator; import org.hibernate.generator.values.GeneratedValues; import org.hibernate.loader.ast.spi.MultiIdEntityLoader; @@ -83,7 +82,7 @@ protected SingleIdEntityLoader buildSingleIdEntityLoader() { } @Override - protected MultiIdEntityLoader buildMultiIdLoader() { + protected MultiIdEntityLoader buildMultiIdLoader() { return reactiveDelegate.buildMultiIdEntityLoader(); } @@ -239,7 +238,7 @@ public CompletionStage mergeReactive( } @Override - public CompletionStage> reactiveMultiLoad(K[] ids, EventSource session, MultiIdLoadOptions loadOptions) { + public CompletionStage> reactiveMultiLoad(K[] ids, SharedSessionContractImplementor session, MultiIdLoadOptions loadOptions) { return reactiveDelegate.multiLoad( ids, session, loadOptions ); } @@ -313,7 +312,7 @@ protected Object initializeLazyPropertiesFromDatastore(Object entity, Object id, } @Override - public CompletionStage reactiveLoad(Object id, Object optionalObject, LockMode lockMode, SharedSessionContractImplementor session) { + public CompletionStage reactiveLoad(Object id, Object optionalObject, LockMode lockMode, SharedSessionContractImplementor session) { return reactiveLoad( id, optionalObject, new LockOptions().setLockMode( lockMode ), session ); } @@ -323,7 +322,7 @@ public Object load(Object id, Object optionalObject, LockOptions lockOptions, Sh } @Override - public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session) { + public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session) { return doReactiveLoad( id, optionalObject, lockOptions, null, session ); } @@ -333,11 +332,11 @@ public Object load(Object id, Object optionalObject, LockOptions lockOptions, Sh } @Override - public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session, Boolean readOnly) { + public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session, Boolean readOnly) { return doReactiveLoad( id, optionalObject, lockOptions, readOnly, session ); } - private CompletionStage doReactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, Boolean readOnly, SharedSessionContractImplementor session) { + private CompletionStage doReactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, Boolean readOnly, SharedSessionContractImplementor session) { return reactiveDelegate.load( this, id, optionalObject, lockOptions, readOnly, session ); } @@ -371,7 +370,7 @@ public CompletionStage reactiveLoadByUniqueKey(String propertyName, Obje * @see AbstractEntityPersister#loadEntityIdByNaturalId(Object[], LockOptions, SharedSessionContractImplementor) */ @Override - public CompletionStage reactiveLoadEntityIdByNaturalId(Object[] orderedNaturalIdValues, LockOptions lockOptions, SharedSessionContractImplementor session) { + public CompletionStage reactiveLoadEntityIdByNaturalId(Object[] orderedNaturalIdValues, LockOptions lockOptions, SharedSessionContractImplementor session) { verifyHasNaturalId(); return reactiveDelegate.loadEntityIdByNaturalId( orderedNaturalIdValues, lockOptions, session ); } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveSingleTableEntityPersister.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveSingleTableEntityPersister.java index 381a83b78..3006a0eae 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveSingleTableEntityPersister.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveSingleTableEntityPersister.java @@ -18,7 +18,6 @@ import org.hibernate.engine.spi.CascadeStyle; import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.event.spi.EventSource; import org.hibernate.generator.Generator; import org.hibernate.generator.values.GeneratedValues; import org.hibernate.generator.values.GeneratedValuesMutationDelegate; @@ -70,7 +69,7 @@ public class ReactiveSingleTableEntityPersister extends SingleTableEntityPersist private static final Log LOG = make( Log.class, lookup() ); - private ReactiveAbstractPersisterDelegate reactiveDelegate; + private final ReactiveAbstractPersisterDelegate reactiveDelegate; public ReactiveSingleTableEntityPersister( final PersistentClass persistentClass, @@ -102,7 +101,7 @@ protected SingleIdEntityLoader buildSingleIdEntityLoader() { } @Override - protected MultiIdEntityLoader buildMultiIdLoader() { + protected MultiIdEntityLoader buildMultiIdLoader() { return reactiveDelegate.buildMultiIdEntityLoader(); } @@ -302,13 +301,13 @@ public CompletionStage reactiveProcessUpdateGenerated(Object id, Object en * @see AbstractEntityPersister#loadEntityIdByNaturalId(Object[], LockOptions, SharedSessionContractImplementor) */ @Override - public CompletionStage reactiveLoadEntityIdByNaturalId(Object[] orderedNaturalIdValues, LockOptions lockOptions, SharedSessionContractImplementor session) { + public CompletionStage reactiveLoadEntityIdByNaturalId(Object[] orderedNaturalIdValues, LockOptions lockOptions, SharedSessionContractImplementor session) { verifyHasNaturalId(); return reactiveDelegate.loadEntityIdByNaturalId( orderedNaturalIdValues, lockOptions, session ); } @Override - public CompletionStage reactiveLoad(Object id, Object optionalObject, LockMode lockMode, SharedSessionContractImplementor session) { + public CompletionStage reactiveLoad(Object id, Object optionalObject, LockMode lockMode, SharedSessionContractImplementor session) { return reactiveLoad( id, optionalObject, new LockOptions().setLockMode( lockMode ), session ); } @@ -318,7 +317,7 @@ public Object load(Object id, Object optionalObject, LockOptions lockOptions, Sh } @Override - public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session) { + public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session) { return doReactiveLoad( id, optionalObject, lockOptions, null, session ); } @@ -328,11 +327,11 @@ public Object load(Object id, Object optionalObject, LockOptions lockOptions, Sh } @Override - public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session, Boolean readOnly) { + public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session, Boolean readOnly) { return doReactiveLoad( id, optionalObject, lockOptions, readOnly, session ); } - private CompletionStage doReactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, Boolean readOnly, SharedSessionContractImplementor session) { + private CompletionStage doReactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, Boolean readOnly, SharedSessionContractImplementor session) { return reactiveDelegate.load( this, id, optionalObject, lockOptions, readOnly, session ); } @@ -397,7 +396,7 @@ public CompletionStage mergeReactive( } @Override - public CompletionStage> reactiveMultiLoad(K[] ids, EventSource session, MultiIdLoadOptions loadOptions) { + public CompletionStage> reactiveMultiLoad(K[] ids, SharedSessionContractImplementor session, MultiIdLoadOptions loadOptions) { return reactiveDelegate.multiLoad( ids, session, loadOptions ); } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveUnionSubclassEntityPersister.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveUnionSubclassEntityPersister.java index cb7995acb..52871e30f 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveUnionSubclassEntityPersister.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveUnionSubclassEntityPersister.java @@ -19,7 +19,6 @@ import org.hibernate.engine.spi.CascadeStyle; import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.event.spi.EventSource; import org.hibernate.generator.Generator; import org.hibernate.generator.values.GeneratedValues; import org.hibernate.id.IdentityGenerator; @@ -83,7 +82,7 @@ protected SingleIdEntityLoader buildSingleIdEntityLoader() { } @Override - protected MultiIdEntityLoader buildMultiIdLoader() { + protected MultiIdEntityLoader buildMultiIdLoader() { return reactiveDelegate.buildMultiIdEntityLoader(); } @@ -149,14 +148,6 @@ public NaturalIdMapping generateNaturalIdMapping(MappingModelCreationProcess cre return ReactiveAbstractEntityPersister.super.generateNaturalIdMapping(creationProcess, bootEntityDescriptor); } - - @Override - protected void validateGenerator() { - if ( super.getGenerator() instanceof IdentityGenerator ) { - throw new MappingException( "Cannot use identity column key generation with mapping for: " + getEntityName() ); - } - } - @Override protected InsertCoordinator buildInsertCoordinator() { return ReactiveCoordinatorFactory.buildInsertCoordinator( this, getFactory() ); @@ -181,6 +172,13 @@ public DomainResult createDomainResult( return reactiveDelegate.createDomainResult( this, navigablePath, tableGroup, resultVariable, creationState ); } + @Override + protected void validateGenerator() { + if ( super.getGenerator() instanceof IdentityGenerator) { + throw new MappingException( "Cannot use identity column key generation with mapping for: " + getEntityName() ); + } + } + @Override public Generator getGenerator() throws HibernateException { return reactiveDelegate.reactive( super.getGenerator() ); @@ -280,7 +278,7 @@ protected Object initializeLazyPropertiesFromDatastore(Object entity, Object id, } @Override - public CompletionStage reactiveLoad(Object id, Object optionalObject, LockMode lockMode, SharedSessionContractImplementor session) { + public CompletionStage reactiveLoad(Object id, Object optionalObject, LockMode lockMode, SharedSessionContractImplementor session) { return reactiveLoad( id, optionalObject, new LockOptions().setLockMode( lockMode ), session ); } @@ -290,7 +288,7 @@ public Object load(Object id, Object optionalObject, LockOptions lockOptions, Sh } @Override - public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session) { + public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session) { return doReactiveLoad( id, optionalObject, lockOptions, null, session ); } @@ -300,11 +298,11 @@ public Object load(Object id, Object optionalObject, LockOptions lockOptions, Sh } @Override - public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session, Boolean readOnly) { + public CompletionStage reactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, SharedSessionContractImplementor session, Boolean readOnly) { return doReactiveLoad( id, optionalObject, lockOptions, readOnly, session ); } - private CompletionStage doReactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, Boolean readOnly, SharedSessionContractImplementor session) { + private CompletionStage doReactiveLoad(Object id, Object optionalObject, LockOptions lockOptions, Boolean readOnly, SharedSessionContractImplementor session) { return reactiveDelegate.load( this, id, optionalObject, lockOptions, readOnly, session ); } @@ -365,7 +363,7 @@ public CompletionStage mergeReactive( } @Override - public CompletionStage> reactiveMultiLoad(K[] ids, EventSource session, MultiIdLoadOptions loadOptions) { + public CompletionStage> reactiveMultiLoad(K[] ids, SharedSessionContractImplementor session, MultiIdLoadOptions loadOptions) { return reactiveDelegate.multiLoad( ids, session, loadOptions ); } @@ -373,7 +371,7 @@ public CompletionStage> reactiveMultiLoad(K[] ids, EventSo * @see AbstractEntityPersister#loadEntityIdByNaturalId(Object[], LockOptions, SharedSessionContractImplementor) */ @Override - public CompletionStage reactiveLoadEntityIdByNaturalId(Object[] orderedNaturalIdValues, LockOptions lockOptions, SharedSessionContractImplementor session) { + public CompletionStage reactiveLoadEntityIdByNaturalId(Object[] orderedNaturalIdValues, LockOptions lockOptions, SharedSessionContractImplementor session) { verifyHasNaturalId(); return reactiveDelegate.loadEntityIdByNaturalId( orderedNaturalIdValues, lockOptions, session ); } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/query/internal/ReactiveNamedObjectRepositoryImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/query/internal/ReactiveNamedObjectRepositoryImpl.java index ef2d70afe..8ab977f6c 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/query/internal/ReactiveNamedObjectRepositoryImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/query/internal/ReactiveNamedObjectRepositoryImpl.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.function.Consumer; +import jakarta.persistence.TypedQuery; import org.hibernate.HibernateException; import org.hibernate.boot.Metadata; import org.hibernate.boot.spi.MetadataImplementor; @@ -108,6 +109,11 @@ public Map checkNamedQueries(QueryEngine queryPlanCa return delegate.checkNamedQueries( queryPlanCache ); } + @Override + public TypedQueryReference registerNamedQuery(String name, TypedQuery query) { + return delegate.registerNamedQuery( name, query ); + } + @Override public void validateNamedQueries(QueryEngine queryEngine) { delegate.validateNamedQueries( queryEngine ); diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java index 72157e46e..1eedcddae 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveSessionImpl.java @@ -1435,7 +1435,7 @@ protected final CompletionStage doLoad(Object id, LoadEventListener.LoadType } private class ReactiveMultiIdentifierLoadAccessImpl implements MultiIdLoadOptions { - private final EntityPersister entityPersister; + private final ReactiveEntityPersister entityPersister; private LockOptions lockOptions; private CacheMode cacheMode; @@ -1450,7 +1450,7 @@ private class ReactiveMultiIdentifierLoadAccessImpl implements MultiIdLoadOpt private boolean readOnly; public ReactiveMultiIdentifierLoadAccessImpl(EntityPersister entityPersister) { - this.entityPersister = entityPersister; + this.entityPersister = (ReactiveEntityPersister) entityPersister; } @Override @@ -1489,12 +1489,7 @@ public Integer getBatchSize() { } public ReactiveMultiIdentifierLoadAccessImpl withBatchSize(int batchSize) { - if ( batchSize < 1 ) { - this.batchSize = null; - } - else { - this.batchSize = batchSize; - } + this.batchSize = batchSize < 1 ? null : batchSize; return this; } @@ -1537,8 +1532,11 @@ public CompletionStage> multiLoad(Object... ids) { Object[] sids = new Object[ids.length]; System.arraycopy( ids, 0, sids, 0, ids.length ); - return perform( () -> (CompletionStage) ( (ReactiveEntityPersister) entityPersister ) - .reactiveMultiLoad( sids, ReactiveSessionImpl.this, this ) ); + return perform( () -> { + final CompletionStage> stage = + entityPersister.reactiveMultiLoad( sids, ReactiveSessionImpl.this, this ); + return (CompletionStage>) stage; + }); } public CompletionStage> perform(Supplier>> executor) { @@ -1572,12 +1570,6 @@ public CompletionStage> perform(Supplier>> execu } } ); } - - @SuppressWarnings("unchecked") - public CompletionStage> multiLoad(List ids) { - return perform( () -> (CompletionStage>) - entityPersister.multiLoad( ids.toArray( new Object[0] ), ReactiveSessionImpl.this, this ) ); - } } private class NaturalIdLoadAccessImpl { diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java index 2d3efe4f5..9bf25caa6 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/session/impl/ReactiveStatelessSessionImpl.java @@ -5,7 +5,6 @@ */ package org.hibernate.reactive.session.impl; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; @@ -50,8 +49,6 @@ import org.hibernate.query.IllegalMutationQueryException; import org.hibernate.query.UnknownNamedQueryException; import org.hibernate.query.criteria.JpaCriteriaInsert; -import org.hibernate.query.criteria.JpaCriteriaQuery; -import org.hibernate.query.criteria.JpaRoot; import org.hibernate.query.hql.spi.SqmQueryImplementor; import org.hibernate.query.named.NamedResultSetMappingMemento; import org.hibernate.query.spi.HqlInterpretation; @@ -223,24 +220,18 @@ public CompletionStage> reactiveGet(Class entityClass, Object... } } - final EntityPersister persister = getEntityPersister( entityClass.getName() ); + Object[] sids = new Object[ids.length]; + System.arraycopy( ids, 0, sids, 0, ids.length ); - final JpaCriteriaQuery query = getCriteriaBuilder().createQuery(entityClass); - final JpaRoot from = query.from(entityClass); - query.where( from.get( persister.getIdentifierPropertyName() ).in(ids) ); - return createReactiveQuery(query).getReactiveResultList() - .thenApply( resultList -> { - final List idList = new ArrayList<>( resultList.size() ); - for (T entity : resultList) { - idList.add( persister.getIdentifier(entity, this) ); - } - final List list = new ArrayList<>( ids.length ); - for (Object id : ids) { - final int pos = idList.indexOf(id); - list.add( pos < 0 ? null : resultList.get(pos) ); - } - return list; - }); + final CompletionStage> stage = + getEntityPersister( entityClass.getName() ) + .reactiveMultiLoad( sids, this, StatelessSessionImpl.MULTI_ID_LOAD_OPTIONS ) + .whenComplete( (v, e) -> { + if ( getPersistenceContext().isLoadFinished() ) { + getPersistenceContext().clear(); + } + } ); + return (CompletionStage>) stage; } @Override @@ -485,9 +476,9 @@ public CompletionStage reactiveRefresh(String entityName, Object entity, L } ); } - private CompletionStage fromInternalFetchProfile( + private CompletionStage fromInternalFetchProfile( CascadingFetchProfile cascadingFetchProfile, - Supplier> supplier) { + Supplier> supplier) { CascadingFetchProfile previous = getLoadQueryInfluencers().getEnabledCascadingFetchProfile(); return voidFuture() .thenCompose( v -> {