diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java index 88033469f808..b007d7244a65 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -84,6 +84,7 @@ import org.hibernate.jpa.internal.ExceptionMapperLegacyJpaImpl; import org.hibernate.jpa.internal.PersistenceUnitUtilImpl; import org.hibernate.mapping.GeneratorSettings; +import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.RootClass; import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.RepresentationMode; @@ -1811,5 +1812,26 @@ public String getDefaultSchema() { public SqlStringGenerationContext getSqlStringGenerationContext() { return sqlStringGenerationContext; } + + @Override + public Generator getOrCreateIdGenerator(String rootName, PersistentClass persistentClass) { + final var existing = getGenerators().get( rootName ); + if ( existing != null ) { + return existing; + } + else { + final var idGenerator = + persistentClass.getIdentifier() + // returns the cached Generator if it was already created + .createGenerator( + getDialect(), + persistentClass.getRootClass(), + persistentClass.getIdentifierProperty(), + getGeneratorSettings() + ); + getGenerators().put( rootName, idGenerator ); + return idGenerator; + } + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/RuntimeModelCreationContext.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/RuntimeModelCreationContext.java index 27bf81ce462e..b60471506b58 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/RuntimeModelCreationContext.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/RuntimeModelCreationContext.java @@ -14,6 +14,7 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.generator.Generator; import org.hibernate.mapping.GeneratorSettings; +import org.hibernate.mapping.PersistentClass; import org.hibernate.query.sqm.function.SqmFunctionRegistry; import org.hibernate.service.ServiceRegistry; import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry; @@ -65,4 +66,7 @@ default MetadataImplementor getMetadata() { Map getGenerators(); GeneratorSettings getGeneratorSettings(); + + // For Hibernate Reactive + Generator getOrCreateIdGenerator(String rootName, PersistentClass persistentClass); } diff --git a/hibernate-core/src/main/java/org/hibernate/tuple/entity/EntityMetamodel.java b/hibernate-core/src/main/java/org/hibernate/tuple/entity/EntityMetamodel.java index 2e348c8f050e..458aec7a160f 100644 --- a/hibernate-core/src/main/java/org/hibernate/tuple/entity/EntityMetamodel.java +++ b/hibernate-core/src/main/java/org/hibernate/tuple/entity/EntityMetamodel.java @@ -155,7 +155,7 @@ public EntityMetamodel( PersistentClass persistentClass, RuntimeModelCreationContext creationContext) { this( persistentClass, creationContext, - rootName -> buildIdGenerator( rootName, persistentClass, creationContext ) ); + rootName -> creationContext.getOrCreateIdGenerator( rootName, persistentClass ) ); } /* @@ -575,26 +575,6 @@ private static boolean writePropertyValue(OnExecutionGenerator generator) { return writePropertyValue; } - private static Generator buildIdGenerator(String rootName, PersistentClass persistentClass, RuntimeModelCreationContext creationContext) { - final var existing = creationContext.getGenerators().get( rootName ); - if ( existing != null ) { - return existing; - } - else { - final var idGenerator = - persistentClass.getIdentifier() - // returns the cached Generator if it was already created - .createGenerator( - creationContext.getDialect(), - persistentClass.getRootClass(), - persistentClass.getIdentifierProperty(), - creationContext.getGeneratorSettings() - ); - creationContext.getGenerators().put( rootName, idGenerator ); - return idGenerator; - } - } - private void verifyNaturalIdProperty(Property property) { final var value = property.getValue(); if ( value instanceof ManyToOne toOne ) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/LocalTemporaryTableMutationStrategyNoDropTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/LocalTemporaryTableMutationStrategyNoDropTest.java index ee70c795c01d..96005742ce1d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/LocalTemporaryTableMutationStrategyNoDropTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/LocalTemporaryTableMutationStrategyNoDropTest.java @@ -23,6 +23,7 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.generator.Generator; import org.hibernate.mapping.GeneratorSettings; +import org.hibernate.mapping.PersistentClass; import org.hibernate.metamodel.spi.MappingMetamodelImplementor; import org.hibernate.metamodel.spi.RuntimeModelCreationContext; import org.hibernate.query.sqm.function.SqmFunctionRegistry; @@ -209,5 +210,10 @@ public String getDefaultSchema() { public GeneratorSettings getGeneratorSettings() { return this; } + + @Override + public Generator getOrCreateIdGenerator(String rootName, PersistentClass persistentClass) { + return null; + } } }