From ee34a2c541a299260009b2376a01ba1bdb2ac9df Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Fri, 13 Dec 2024 07:46:51 +0100 Subject: [PATCH 1/3] Change properties to test ORM 7.1 snapshots --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index d098a7035..e3749d3e8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -31,7 +31,7 @@ org.gradle.java.installations.auto-download=false #db = MSSQL # Enable the maven Central Snapshot repository, when set to any value (the value is ignored) -#enableCentralSonatypeSnapshotsRep = true +enableCentralSonatypeSnapshotsRep = true # Enable the maven local repository (for local development when needed) when present (value ignored) #enableMavenLocalRepo = true @@ -39,14 +39,14 @@ org.gradle.java.installations.auto-download=false ### Settings the following properties will override the version defined in gradle/libs.versions.toml # The default Hibernate ORM version (override using `-PhibernateOrmVersion=the.version.you.want`) -#hibernateOrmVersion = 7.1.0.Final +hibernateOrmVersion = 7.1.+ # Override default Hibernate ORM Gradle plugin version #hibernateOrmGradlePluginVersion = 7.1.0.Final # If set to true, skip Hibernate ORM version parsing (default is true, if set to null) # this is required when using intervals or weird versions or the build will fail -#skipOrmVersionParsing = true +skipOrmVersionParsing = true # Override default Vert.x Sql client version #vertxSqlClientVersion = 5.0.2-SNAPSHOT From 815c12bfd29c5c176a82d5aa6d9dcf586b6c77b0 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Mon, 8 Sep 2025 12:46:46 +0200 Subject: [PATCH 2/3] [#2495] Adapt to changes to AbstractEntityPersister in 7.2 --- gradle.properties | 2 +- .../impl/ReactiveEntityUpdateAction.java | 2 +- .../ReactiveGeneratedValuesHelper.java | 75 +++++++++++- ...ompositeNestedGeneratedValueGenerator.java | 4 +- .../ReactiveRuntimeModelCreationContext.java | 107 ++++++++++++++++-- .../NoJdbcConnectionProviderInitiator.java | 4 +- .../session/impl/ReactiveSessionImpl.java | 4 +- .../spi/ReactiveListResultsConsumer.java | 2 +- .../tuple/entity/ReactiveEntityMetamodel.java | 10 +- .../jdbc/ReactiveArrayJdbcType.java | 24 +++- 10 files changed, 202 insertions(+), 32 deletions(-) diff --git a/gradle.properties b/gradle.properties index e3749d3e8..5c148dea2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,7 +39,7 @@ enableCentralSonatypeSnapshotsRep = true ### Settings the following properties will override the version defined in gradle/libs.versions.toml # The default Hibernate ORM version (override using `-PhibernateOrmVersion=the.version.you.want`) -hibernateOrmVersion = 7.1.+ +hibernateOrmVersion = 7.2.+ # Override default Hibernate ORM Gradle plugin version #hibernateOrmGradlePluginVersion = 7.1.0.Final diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/engine/impl/ReactiveEntityUpdateAction.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/engine/impl/ReactiveEntityUpdateAction.java index 4a6b5e149..4d212ee72 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/engine/impl/ReactiveEntityUpdateAction.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/engine/impl/ReactiveEntityUpdateAction.java @@ -94,7 +94,7 @@ public CompletionStage reactiveExecute() throws HibernateException { .thenAccept( v -> { handleDeleted( entry ); updateCacheItem( persister, ck, entry ); - handleNaturalIdResolutions( persister, session, id ); + handleNaturalIdSharedResolutions( id, persister, session.getPersistenceContext() ); postUpdate(); final StatisticsImplementor statistics = session.getFactory().getStatistics(); 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 e842adf11..21e44cde6 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 @@ -10,22 +10,38 @@ import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.generator.EventType; +import org.hibernate.generator.Generator; +import org.hibernate.generator.GeneratorCreationContext; import org.hibernate.generator.values.GeneratedValueBasicResultBuilder; import org.hibernate.generator.values.GeneratedValues; import org.hibernate.generator.values.GeneratedValuesMutationDelegate; import org.hibernate.generator.values.internal.GeneratedValuesHelper; import org.hibernate.generator.values.internal.GeneratedValuesImpl; import org.hibernate.generator.values.internal.GeneratedValuesMappingProducer; -import org.hibernate.id.IdentifierGeneratorHelper; +import org.hibernate.id.CompositeNestedGeneratedValueGenerator; +import org.hibernate.id.Configurable; +import org.hibernate.id.IdentifierGenerator; +import org.hibernate.id.SelectGenerator; +import org.hibernate.id.enhanced.DatabaseStructure; +import org.hibernate.id.enhanced.SequenceStructure; +import org.hibernate.id.enhanced.SequenceStyleGenerator; +import org.hibernate.id.enhanced.TableGenerator; +import org.hibernate.id.enhanced.TableStructure; import org.hibernate.id.insert.GetGeneratedKeysDelegate; import org.hibernate.id.insert.UniqueKeySelectingDelegate; -import org.hibernate.internal.CoreLogging; -import org.hibernate.internal.CoreMessageLogger; import org.hibernate.metamodel.mapping.ModelPart; +import org.hibernate.metamodel.spi.RuntimeModelCreationContext; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.pretty.MessageHelper; import org.hibernate.query.spi.QueryOptions; +import org.hibernate.reactive.id.ReactiveIdentifierGenerator; +import org.hibernate.reactive.id.impl.EmulatedSequenceReactiveIdentifierGenerator; +import org.hibernate.reactive.id.impl.ReactiveCompositeNestedGeneratedValueGenerator; +import org.hibernate.reactive.id.impl.ReactiveGeneratorWrapper; +import org.hibernate.reactive.id.impl.ReactiveSequenceIdentifierGenerator; +import org.hibernate.reactive.id.impl.TableReactiveIdentifierGenerator; import org.hibernate.reactive.id.insert.ReactiveInsertReturningDelegate; +import org.hibernate.reactive.logging.impl.Log; import org.hibernate.reactive.sql.exec.spi.ReactiveRowProcessingState; import org.hibernate.reactive.sql.exec.spi.ReactiveValuesResultSet; import org.hibernate.reactive.sql.results.internal.ReactiveDirectResultSetAccess; @@ -48,8 +64,10 @@ import java.util.List; import java.util.concurrent.CompletionStage; +import static java.lang.invoke.MethodHandles.lookup; import static org.hibernate.generator.values.internal.GeneratedValuesHelper.noCustomSql; import static org.hibernate.internal.NaturalIdHelper.getNaturalIdPropertyNames; +import static org.hibernate.reactive.logging.impl.LoggerFactory.make; import static org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer.UniqueSemantic.NONE; /** @@ -57,7 +75,7 @@ */ @Internal public class ReactiveGeneratedValuesHelper { - private static final CoreMessageLogger LOG = CoreLogging.messageLogger( IdentifierGeneratorHelper.class ); + private static final Log LOG = make( Log.class, lookup() ); /** * @@ -225,4 +243,53 @@ public boolean shouldReturnProxies() { return results.get( 0 ); } ); } + + public static Generator augmentWithReactiveGenerator( + Generator generator, + GeneratorCreationContext creationContext, + RuntimeModelCreationContext runtimeModelCreationContext) { + if ( generator instanceof SequenceStyleGenerator sequenceStyleGenerator) { + final DatabaseStructure structure = sequenceStyleGenerator.getDatabaseStructure(); + if ( structure instanceof TableStructure ) { + return initialize( (IdentifierGenerator) generator, new EmulatedSequenceReactiveIdentifierGenerator( (TableStructure) structure, runtimeModelCreationContext ), creationContext ); + } + if ( structure instanceof SequenceStructure ) { + return initialize( (IdentifierGenerator) generator, new ReactiveSequenceIdentifierGenerator( structure, runtimeModelCreationContext ), creationContext ); + } + throw LOG.unknownStructureType(); + } + if ( generator instanceof TableGenerator tableGenerator ) { + return initialize( + (IdentifierGenerator) generator, + new TableReactiveIdentifierGenerator( tableGenerator, runtimeModelCreationContext ), + creationContext + ); + } + if ( generator instanceof SelectGenerator ) { + throw LOG.selectGeneratorIsNotSupportedInHibernateReactive(); + } + if ( generator instanceof CompositeNestedGeneratedValueGenerator compositeNestedGeneratedValueGenerator ) { + final ReactiveCompositeNestedGeneratedValueGenerator reactiveCompositeNestedGeneratedValueGenerator = new ReactiveCompositeNestedGeneratedValueGenerator( + compositeNestedGeneratedValueGenerator, + creationContext, + runtimeModelCreationContext + ); + return initialize( + (IdentifierGenerator) generator, + reactiveCompositeNestedGeneratedValueGenerator, + creationContext + ); + } + //nothing to do + return generator; + } + + private static Generator initialize( + IdentifierGenerator idGenerator, + ReactiveIdentifierGenerator reactiveIdGenerator, + GeneratorCreationContext creationContext) { + ( (Configurable) reactiveIdGenerator ).initialize( creationContext.getSqlStringGenerationContext() ); + return new ReactiveGeneratorWrapper( reactiveIdGenerator, idGenerator ); + } + } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/id/impl/ReactiveCompositeNestedGeneratedValueGenerator.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/id/impl/ReactiveCompositeNestedGeneratedValueGenerator.java index cb6b03ab5..1da85ecc1 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/id/impl/ReactiveCompositeNestedGeneratedValueGenerator.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/id/impl/ReactiveCompositeNestedGeneratedValueGenerator.java @@ -13,9 +13,9 @@ import org.hibernate.id.IdentifierGenerationException; import org.hibernate.mapping.Component; import org.hibernate.metamodel.spi.RuntimeModelCreationContext; +import org.hibernate.reactive.generator.values.internal.ReactiveGeneratedValuesHelper; import org.hibernate.reactive.id.ReactiveIdentifierGenerator; import org.hibernate.reactive.session.ReactiveConnectionSupplier; -import org.hibernate.reactive.tuple.entity.ReactiveEntityMetamodel; import java.util.ArrayList; import java.util.List; @@ -46,7 +46,7 @@ private static List reactivePlans( final List plans = new ArrayList<>(); for ( GenerationPlan plan : generator.getGenerationPlans() ) { final GenerationPlan reactivePlane = new Component.ValueGenerationPlan( - (BeforeExecutionGenerator) ReactiveEntityMetamodel.augmentWithReactiveGenerator( + (BeforeExecutionGenerator) ReactiveGeneratedValuesHelper.augmentWithReactiveGenerator( plan.getGenerator(), creationContext, runtimeModelCreationContext diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/metamodel/mapping/internal/ReactiveRuntimeModelCreationContext.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/metamodel/mapping/internal/ReactiveRuntimeModelCreationContext.java index 876312b47..fc5a6cb1e 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/metamodel/mapping/internal/ReactiveRuntimeModelCreationContext.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/metamodel/mapping/internal/ReactiveRuntimeModelCreationContext.java @@ -5,8 +5,7 @@ */ package org.hibernate.reactive.metamodel.mapping.internal; -import java.util.Map; - +import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.boot.spi.MetadataImplementor; @@ -16,31 +15,37 @@ import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.generator.Generator; +import org.hibernate.generator.GeneratorCreationContext; import org.hibernate.mapping.GeneratorSettings; import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.Property; +import org.hibernate.mapping.RootClass; +import org.hibernate.mapping.SimpleValue; import org.hibernate.metamodel.spi.MappingMetamodelImplementor; import org.hibernate.metamodel.spi.RuntimeModelCreationContext; -import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.sqm.function.SqmFunctionRegistry; -import org.hibernate.reactive.tuple.entity.ReactiveEntityMetamodel; +import org.hibernate.reactive.logging.impl.Log; import org.hibernate.service.ServiceRegistry; -import org.hibernate.tuple.entity.EntityMetamodel; +import org.hibernate.type.Type; import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry; import org.hibernate.type.spi.TypeConfiguration; +import java.util.Map; + +import static java.lang.invoke.MethodHandles.lookup; +import static org.hibernate.reactive.generator.values.internal.ReactiveGeneratedValuesHelper.augmentWithReactiveGenerator; +import static org.hibernate.reactive.logging.impl.LoggerFactory.make; + public class ReactiveRuntimeModelCreationContext implements RuntimeModelCreationContext { + private static final Log LOG = make( Log.class, lookup() ); + private final RuntimeModelCreationContext delegate; public ReactiveRuntimeModelCreationContext(RuntimeModelCreationContext delegate) { this.delegate = delegate; } - @Override - public EntityMetamodel createEntityMetamodel(PersistentClass persistentClass, EntityPersister persister) { - return new ReactiveEntityMetamodel( persistentClass, persister, delegate ); - } - @Override public SessionFactoryImplementor getSessionFactory() { return delegate.getSessionFactory(); @@ -125,4 +130,86 @@ public Map getGenerators() { public GeneratorSettings getGeneratorSettings() { return delegate.getGeneratorSettings(); } + + @Override + public Generator getOrCreateIdGenerator(String rootName, PersistentClass persistentClass){ + final Generator existing = getGenerators().get( rootName ); + if ( existing != null ) { + return existing; + } + else { + final SimpleValue identifier = (SimpleValue) persistentClass.getIdentifier(); + final Generator idgenerator = augmentWithReactiveGenerator( + identifier.createGenerator( + getDialect(), + persistentClass.getRootClass(), + persistentClass.getIdentifierProperty(), + getGeneratorSettings() + ), + new IdGeneratorCreationContext( + persistentClass.getRootClass(), + persistentClass.getIdentifierProperty(), + getGeneratorSettings(), + identifier, + this + ), + this ); + getGenerators().put( rootName, idgenerator ); + return idgenerator; + } + } + + private record IdGeneratorCreationContext( + RootClass rootClass, + Property property, + GeneratorSettings defaults, + SimpleValue identifier, + RuntimeModelCreationContext buildingContext) implements GeneratorCreationContext { + + @Override + public Database getDatabase() { + return buildingContext.getBootModel().getDatabase(); + } + + @Override + public ServiceRegistry getServiceRegistry() { + return buildingContext.getBootstrapContext().getServiceRegistry(); + } + + @Override + public SqlStringGenerationContext getSqlStringGenerationContext() { + return defaults.getSqlStringGenerationContext(); + } + + @Override + public String getDefaultCatalog() { + return defaults.getDefaultCatalog(); + } + + @Override + public String getDefaultSchema() { + return defaults.getDefaultSchema(); + } + + @Override + public RootClass getRootClass() { + return rootClass; + } + + @Override + public PersistentClass getPersistentClass() { + return rootClass; + } + + @Override + public Property getProperty() { + return property; + } + + @Override + public Type getType() { + return identifier.getType(); + } + } + } diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcConnectionProviderInitiator.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcConnectionProviderInitiator.java index a57f72b16..6e32d5e7f 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcConnectionProviderInitiator.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/NoJdbcConnectionProviderInitiator.java @@ -7,7 +7,7 @@ import org.hibernate.boot.registry.StandardServiceInitiator; import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator; -import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; +import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProvider; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.service.spi.ServiceRegistryImplementor; @@ -28,7 +28,7 @@ public class NoJdbcConnectionProviderInitiator implements StandardServiceInitiat @Override public ConnectionProvider initiateService(Map configurationValues, ServiceRegistryImplementor registry) { ConnectionProvider provider = ConnectionProviderInitiator.INSTANCE.initiateService(configurationValues, registry); - if (provider instanceof DriverManagerConnectionProviderImpl) { + if ( provider instanceof DriverManagerConnectionProvider ) { return NoJdbcConnectionProvider.INSTANCE; } return provider; 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 7b0bd112a..de45b0534 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 @@ -195,8 +195,8 @@ private void threadCheck() { } @Override - protected PersistenceContext createPersistenceContext() { - return new ReactivePersistenceContextAdapter( super.createPersistenceContext() ); + protected PersistenceContext createPersistenceContext(SessionCreationOptions options) { + return new ReactivePersistenceContextAdapter( super.createPersistenceContext( options ) ); } @Override diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/sql/results/spi/ReactiveListResultsConsumer.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/sql/results/spi/ReactiveListResultsConsumer.java index e7283647f..108920f1a 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/sql/results/spi/ReactiveListResultsConsumer.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/sql/results/spi/ReactiveListResultsConsumer.java @@ -271,7 +271,7 @@ private JavaType resolveDomainResultJavaType( return (JavaType) resultJavaTypes.get( 0 ); } - return javaTypeRegistry.resolveDescriptor( Object[].class ); + return javaTypeRegistry.getDescriptor( Object[].class ); } @Override diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/tuple/entity/ReactiveEntityMetamodel.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/tuple/entity/ReactiveEntityMetamodel.java index 14e227358..f8216bf76 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/tuple/entity/ReactiveEntityMetamodel.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/tuple/entity/ReactiveEntityMetamodel.java @@ -27,7 +27,6 @@ import org.hibernate.mapping.RootClass; import org.hibernate.mapping.SimpleValue; import org.hibernate.metamodel.spi.RuntimeModelCreationContext; -import org.hibernate.persister.entity.EntityPersister; import org.hibernate.reactive.id.ReactiveIdentifierGenerator; import org.hibernate.reactive.id.impl.EmulatedSequenceReactiveIdentifierGenerator; import org.hibernate.reactive.id.impl.ReactiveCompositeNestedGeneratedValueGenerator; @@ -42,17 +41,19 @@ import static java.lang.invoke.MethodHandles.lookup; import static org.hibernate.reactive.logging.impl.LoggerFactory.make; +/** + * @deprecated No Longer used + */ +@Deprecated(since = "4.2", forRemoval = true) public class ReactiveEntityMetamodel extends EntityMetamodel { private static final Log LOG = make( Log.class, lookup() ); public ReactiveEntityMetamodel( PersistentClass persistentClass, - EntityPersister persister, RuntimeModelCreationContext creationContext) { this( persistentClass, - persister, creationContext, s -> buildIdGenerator( s, persistentClass, creationContext ) ); @@ -60,10 +61,9 @@ public ReactiveEntityMetamodel( public ReactiveEntityMetamodel( PersistentClass persistentClass, - EntityPersister persister, RuntimeModelCreationContext creationContext, Function generatorSupplier) { - super( persistentClass, persister, creationContext, generatorSupplier ); + super( persistentClass, creationContext, generatorSupplier ); } private static Generator buildIdGenerator( diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/type/descriptor/jdbc/ReactiveArrayJdbcType.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/type/descriptor/jdbc/ReactiveArrayJdbcType.java index 99d7efaf7..5aee97bc7 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/type/descriptor/jdbc/ReactiveArrayJdbcType.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/type/descriptor/jdbc/ReactiveArrayJdbcType.java @@ -6,6 +6,7 @@ package org.hibernate.reactive.type.descriptor.jdbc; import java.lang.reflect.Array; +import java.lang.reflect.Type; import java.sql.CallableStatement; import java.sql.Date; import java.sql.PreparedStatement; @@ -20,6 +21,7 @@ import org.hibernate.reactive.adaptor.impl.ArrayAdaptor; import org.hibernate.reactive.adaptor.impl.ResultSetAdaptor; +import org.hibernate.type.BasicPluralType; import org.hibernate.type.descriptor.ValueBinder; import org.hibernate.type.descriptor.ValueExtractor; import org.hibernate.type.descriptor.WrapperOptions; @@ -32,8 +34,10 @@ import org.hibernate.type.descriptor.jdbc.JdbcLiteralFormatter; import org.hibernate.type.descriptor.jdbc.JdbcType; import org.hibernate.type.descriptor.jdbc.internal.JdbcLiteralFormatterArray; +import org.hibernate.type.internal.ParameterizedTypeImpl; import org.hibernate.type.spi.TypeConfiguration; +import static java.lang.reflect.Array.newInstance; /** @@ -63,10 +67,22 @@ public JavaType getJdbcRecommendedJavaTypeMapping( Integer precision, Integer scale, TypeConfiguration typeConfiguration) { - final JavaType elementJavaType = elementJdbcType - .getJdbcRecommendedJavaTypeMapping( precision, scale, typeConfiguration ); - return typeConfiguration.getJavaTypeRegistry() - .resolveDescriptor( Array.newInstance( elementJavaType.getJavaTypeClass(), 0 ).getClass() ); + final JavaType elementJavaType = + elementJdbcType.getJdbcRecommendedJavaTypeMapping( precision, scale, typeConfiguration ); + final var javaType = + typeConfiguration.getJavaTypeRegistry() + .resolveDescriptor( newInstance( elementJavaType.getJavaTypeClass(), 0 ).getClass() ); + if ( javaType instanceof BasicPluralType ) { + //noinspection unchecked + return (JavaType) javaType; + } + else { + //noinspection unchecked + return (JavaType) javaType.createJavaType( + new ParameterizedTypeImpl( javaType.getJavaTypeClass(), new Type[0], null ), + typeConfiguration + ); + } } @Override From 142c415defe58bfbe7c5cfb385a1300eaac94f6d Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Wed, 10 Sep 2025 15:22:55 +0200 Subject: [PATCH 3/3] [#2495] Adapt to changes to ActionQueque, SessionFactoryImpl and SessionCreationOptions in 7.2 --- .../event/impl/DefaultReactiveRefreshEventListener.java | 4 ++-- .../reactive/mutiny/impl/MutinySessionFactoryImpl.java | 7 ++++--- .../reactive/session/impl/ReactiveSessionImpl.java | 5 +++-- .../session/impl/ReactiveStatelessSessionImpl.java | 2 +- .../reactive/stage/impl/StageSessionFactoryImpl.java | 7 ++++--- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/DefaultReactiveRefreshEventListener.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/DefaultReactiveRefreshEventListener.java index ba3edda4a..82964597b 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/DefaultReactiveRefreshEventListener.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/event/impl/DefaultReactiveRefreshEventListener.java @@ -200,7 +200,7 @@ private static void evictEntity(Object entity, EntityPersister persister, Object ); final SoftLock lock = cache.lockItem( source, ck, previousVersion ); cache.remove(source, ck ); - source.getActionQueue().registerProcess( (success, session) -> cache.unlockItem( session, ck, lock ) ); + source.getActionQueue().registerCallback( (success, session) -> cache.unlockItem( session, ck, lock ) ); } } @@ -314,7 +314,7 @@ private void evictCachedCollections(Type[] types, Object id, EventSource source) ); final SoftLock lock = cache.lockItem( source, ck, null ); cache.remove( source, ck ); - actionQueue.registerProcess( (success, session) -> cache.unlockItem( session, ck, lock ) ); + actionQueue.registerCallback( (success, session) -> cache.unlockItem( session, ck, lock ) ); } } else if ( type.isComponentType() ) { diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinySessionFactoryImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinySessionFactoryImpl.java index 46a71b0b8..e69a040ce 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinySessionFactoryImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/mutiny/impl/MutinySessionFactoryImpl.java @@ -13,7 +13,8 @@ import java.util.function.Supplier; import org.hibernate.Cache; -import org.hibernate.internal.SessionCreationOptions; +import org.hibernate.engine.creation.internal.SessionBuilderImpl; +import org.hibernate.engine.creation.internal.SessionCreationOptions; import org.hibernate.internal.SessionFactoryImpl; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.reactive.common.spi.Implementor; @@ -133,11 +134,11 @@ public Uni openStatelessSession(String tenantId) { } private SessionCreationOptions options() { - return new SessionFactoryImpl.SessionBuilderImpl( delegate ); + return new SessionBuilderImpl( delegate ); } private SessionCreationOptions options(String tenantIdentifier) { - return new SessionFactoryImpl.SessionBuilderImpl( delegate ) + return (SessionCreationOptions) new SessionBuilderImpl( delegate ) .tenantIdentifier( tenantIdentifier ); } 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 de45b0534..bf66dc799 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 @@ -20,6 +20,7 @@ import org.hibernate.bytecode.enhance.spi.interceptor.EnhancementAsProxyLazinessInterceptor; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.dialect.Dialect; +import org.hibernate.engine.creation.internal.SessionCreationOptions; import org.hibernate.engine.internal.ReactivePersistenceContextAdapter; import org.hibernate.engine.spi.EffectiveEntityGraph; import org.hibernate.engine.spi.EntityEntry; @@ -48,7 +49,6 @@ import org.hibernate.graph.GraphSemantic; import org.hibernate.graph.RootGraph; import org.hibernate.graph.spi.RootGraphImplementor; -import org.hibernate.internal.SessionCreationOptions; import org.hibernate.internal.SessionFactoryImpl; import org.hibernate.internal.SessionImpl; import org.hibernate.jpa.spi.NativeQueryTupleTransformer; @@ -167,7 +167,8 @@ public class ReactiveSessionImpl extends SessionImpl implements ReactiveSession, private transient ExceptionConverter exceptionConverter; public ReactiveSessionImpl( - SessionFactoryImpl delegate, SessionCreationOptions options, + SessionFactoryImpl delegate, + SessionCreationOptions options, ReactiveConnection connection) { super( delegate, options ); InternalStateAssertions.assertUseOnEventLoop(); 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 51cf19747..90304bc63 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 @@ -14,6 +14,7 @@ import org.hibernate.cache.spi.access.EntityDataAccess; import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.dialect.Dialect; +import org.hibernate.engine.creation.internal.SessionCreationOptions; import org.hibernate.engine.internal.ReactivePersistenceContextAdapter; import org.hibernate.engine.spi.CollectionEntry; import org.hibernate.engine.spi.LoadQueryInfluencers; @@ -27,7 +28,6 @@ import org.hibernate.graph.internal.RootGraphImpl; import org.hibernate.graph.spi.RootGraphImplementor; import org.hibernate.id.IdentifierGenerationException; -import org.hibernate.internal.SessionCreationOptions; import org.hibernate.internal.SessionFactoryImpl; import org.hibernate.internal.StatelessSessionImpl; import org.hibernate.jpa.spi.NativeQueryTupleTransformer; diff --git a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageSessionFactoryImpl.java b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageSessionFactoryImpl.java index 56c574ce4..f0d4afefe 100644 --- a/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageSessionFactoryImpl.java +++ b/hibernate-reactive-core/src/main/java/org/hibernate/reactive/stage/impl/StageSessionFactoryImpl.java @@ -7,7 +7,8 @@ import jakarta.persistence.metamodel.Metamodel; import org.hibernate.Cache; -import org.hibernate.internal.SessionCreationOptions; +import org.hibernate.engine.creation.internal.SessionBuilderImpl; +import org.hibernate.engine.creation.internal.SessionCreationOptions; import org.hibernate.internal.SessionFactoryImpl; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.reactive.common.spi.Implementor; @@ -124,11 +125,11 @@ private CompletionStage create(ReactiveConnection connection, Supplier } private SessionCreationOptions options() { - return new SessionFactoryImpl.SessionBuilderImpl( delegate ); + return new SessionBuilderImpl( delegate ); } private SessionCreationOptions options(String tenantIdentifier) { - return new SessionFactoryImpl.SessionBuilderImpl( delegate ) + return (SessionCreationOptions) new SessionBuilderImpl( delegate ) .tenantIdentifier( tenantIdentifier ); }