From ef328fb30c9cec67f83e3b68fc15cc4fb1282f56 Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Fri, 15 Nov 2024 18:12:42 +0100 Subject: [PATCH 1/8] HHH-18854 Change scopes of methods in AbstractInformationExtractorImpl Hibernate Reactive extends this class and needs to access/overrides some of the methods. --- .../internal/AbstractInformationExtractorImpl.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java index 5fd9a9b8dd2d..49253e2a3d79 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java @@ -638,7 +638,10 @@ private void populateTablesWithColumns( } } - private ColumnInformationImpl columnInformation(TableInformation tableInformation, ResultSet resultSet) + /* + * Hibernate Reactive overrides this + */ + protected ColumnInformationImpl columnInformation(TableInformation tableInformation, ResultSet resultSet) throws SQLException { return new ColumnInformationImpl( tableInformation, @@ -864,7 +867,10 @@ protected void addColumns(TableInformation tableInformation) { } } - private Boolean interpretTruthValue(String nullable) { + /* + * Used by Hibernate Reactive + */ + protected Boolean interpretTruthValue(String nullable) { if ( "yes".equalsIgnoreCase( nullable ) ) { return Boolean.TRUE; } From abf433e8fd84c871061c8fcc3fa2627f3e271235 Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Fri, 15 Nov 2024 18:14:06 +0100 Subject: [PATCH 2/8] HHH-18854 Allow changes to the id generator Hibernate Reactive needs to replace or extends the original id generators. This changes make it possible to pass a function to the EntityMetamodel that allows Hibernate Reactive to replace the original id generators --- .../hibernate/id/enhanced/TableStructure.java | 7 +++++ .../entity/AbstractEntityPersister.java | 29 ++++++++++++++++++- .../entity/JoinedSubclassEntityPersister.java | 14 ++++++++- .../entity/SingleTableEntityPersister.java | 14 ++++++++- .../entity/UnionSubclassEntityPersister.java | 14 ++++++++- .../tuple/entity/EntityMetamodel.java | 17 +++++++++-- 6 files changed, 89 insertions(+), 6 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java index 5fde5a4b8845..cfb33a1e1436 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java @@ -111,6 +111,13 @@ public QualifiedName getPhysicalName() { return physicalTableName; } + /* + * Used by Hibernate Reactive + */ + public Identifier getLogicalValueColumnNameIdentifier() { + return logicalValueColumnNameIdentifier; + } + @Override public int getInitialValue() { return initialValue; diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index 8ab2110f512a..332d6e78aa18 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -469,11 +469,38 @@ public abstract class AbstractEntityPersister private List uniqueKeyEntries = null; //lazily initialized private ConcurrentHashMap nonLazyPropertyLoadPlansByName; + /** + * A factory for the creation of an EntityMetamodel. + *

+ * Hibernate Reactive uses it to pass its own entity metamodel class + * and adapt the identifier generators. + */ + public static class EntityMetamodelFactory { + public EntityMetamodel createEntityMetamodel( + PersistentClass persistentClass, + EntityPersister persister, + RuntimeModelCreationContext creationContext) { + return new EntityMetamodel( persistentClass, persister, creationContext ); + } + } + public AbstractEntityPersister( final PersistentClass persistentClass, final EntityDataAccess cacheAccessStrategy, final NaturalIdDataAccess naturalIdRegionAccessStrategy, final RuntimeModelCreationContext creationContext) throws HibernateException { + this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() ); + } + + /* + * Used by Hibernate Reactive + */ + public AbstractEntityPersister( + final PersistentClass persistentClass, + final EntityDataAccess cacheAccessStrategy, + final NaturalIdDataAccess naturalIdRegionAccessStrategy, + final RuntimeModelCreationContext creationContext, + final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException { this.jpaEntityName = persistentClass.getJpaEntityName(); //set it here, but don't call it, since it's still uninitialized! @@ -500,7 +527,7 @@ public AbstractEntityPersister( isLazyPropertiesCacheable = true; } - entityMetamodel = new EntityMetamodel( persistentClass, this, creationContext ); + entityMetamodel = entityMetamodelFactory.createEntityMetamodel( persistentClass, this, creationContext ); entityEntryFactory = entityMetamodel.isMutable() ? MutableEntityEntryFactory.INSTANCE diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java index c7fdaa885edd..c9cec2862919 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java @@ -160,8 +160,20 @@ public JoinedSubclassEntityPersister( final EntityDataAccess cacheAccessStrategy, final NaturalIdDataAccess naturalIdRegionAccessStrategy, final RuntimeModelCreationContext creationContext) throws HibernateException { + this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory()); + } + + /* + * Used by Hibernate Reactive + */ + public JoinedSubclassEntityPersister( + final PersistentClass persistentClass, + final EntityDataAccess cacheAccessStrategy, + final NaturalIdDataAccess naturalIdRegionAccessStrategy, + final RuntimeModelCreationContext creationContext, + final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException { - super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext ); + super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory ); final Dialect dialect = creationContext.getDialect(); final SqmFunctionRegistry functionRegistry = creationContext.getFunctionRegistry(); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java index b1de0a71bb2a..00a2eae6d9ba 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java @@ -114,8 +114,20 @@ public SingleTableEntityPersister( final EntityDataAccess cacheAccessStrategy, final NaturalIdDataAccess naturalIdRegionAccessStrategy, final RuntimeModelCreationContext creationContext) throws HibernateException { + this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() ); + } + + /* + * Used by Hibernate Reactive + */ + public SingleTableEntityPersister( + final PersistentClass persistentClass, + final EntityDataAccess cacheAccessStrategy, + final NaturalIdDataAccess naturalIdRegionAccessStrategy, + final RuntimeModelCreationContext creationContext, + final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException { - super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext ); + super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory ); final Dialect dialect = creationContext.getDialect(); final SqmFunctionRegistry functionRegistry = creationContext.getFunctionRegistry(); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java index 3fa14b0b64e5..5386b8b7a09c 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java @@ -95,7 +95,19 @@ public UnionSubclassEntityPersister( final EntityDataAccess cacheAccessStrategy, final NaturalIdDataAccess naturalIdRegionAccessStrategy, final RuntimeModelCreationContext creationContext) throws HibernateException { - super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext ); + this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() ); + } + + /* + * Used by Hibernate Reactive + */ + public UnionSubclassEntityPersister( + final PersistentClass persistentClass, + final EntityDataAccess cacheAccessStrategy, + final NaturalIdDataAccess naturalIdRegionAccessStrategy, + final RuntimeModelCreationContext creationContext, + final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException { + super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory ); validateGenerator(); 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 f23eb84c3984..744f3417fa98 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 @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; import org.hibernate.HibernateException; import org.hibernate.MappingException; @@ -149,6 +150,18 @@ public EntityMetamodel( PersistentClass persistentClass, EntityPersister persister, RuntimeModelCreationContext creationContext) { + this( persistentClass, persister, creationContext, + rootName -> buildIdGenerator( rootName, persistentClass, creationContext ) ); + } + + /* + * Used by Hibernate Reactive to adapt the id generators + */ + public EntityMetamodel( + PersistentClass persistentClass, + EntityPersister persister, + RuntimeModelCreationContext creationContext, + Function generatorSupplier) { this.sessionFactory = creationContext.getSessionFactory(); // Improves performance of EntityKey#equals by avoiding content check in String#equals @@ -160,7 +173,7 @@ public EntityMetamodel( subclassId = persistentClass.getSubclassId(); - final Generator idgenerator = buildIdGenerator( persistentClass, creationContext ); + final Generator idgenerator = generatorSupplier.apply( rootName ); identifierAttribute = PropertyFactory.buildIdentifierAttribute( persistentClass, idgenerator ); versioned = persistentClass.isVersioned(); @@ -483,7 +496,7 @@ private static boolean writePropertyValue(OnExecutionGenerator generator) { return writePropertyValue; } - private Generator buildIdGenerator(PersistentClass persistentClass, RuntimeModelCreationContext creationContext) { + private static Generator buildIdGenerator(String rootName, PersistentClass persistentClass, RuntimeModelCreationContext creationContext) { final Generator existing = creationContext.getGenerators().get( rootName ); if ( existing != null ) { return existing; From 1183954d39a1f57492d373a77544ac6dc23050f1 Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Tue, 19 Nov 2024 15:41:21 +0100 Subject: [PATCH 3/8] HHH-18854 Minor refactoring in AbstractMutationCoordinator With this change I can remove a lot of duplicate code in Hibernate Reactive. --- .../entity/mutation/AbstractMutationCoordinator.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java index 386f5f58de05..a9d029943b78 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/mutation/AbstractMutationCoordinator.java @@ -82,8 +82,7 @@ protected MutationOperationGroup createOperationGroup(ValuesAnalysis valuesAnaly case 0: return MutationOperationGroupFactory.noOperations( mutationGroup ); case 1: { - final MutationOperation operation = mutationGroup.getSingleTableMutation() - .createMutationOperation( valuesAnalysis, factory() ); + final MutationOperation operation = createOperation( valuesAnalysis, mutationGroup.getSingleTableMutation() ); return operation == null ? MutationOperationGroupFactory.noOperations( mutationGroup ) : MutationOperationGroupFactory.singleOperation( mutationGroup, operation ); @@ -116,6 +115,13 @@ protected MutationOperationGroup createOperationGroup(ValuesAnalysis valuesAnaly } } + /* + * Used by Hibernate Reactive + */ + protected MutationOperation createOperation(ValuesAnalysis valuesAnalysis, TableMutation singleTableMutation) { + return singleTableMutation.createMutationOperation( valuesAnalysis, factory() ); + } + protected void handleValueGeneration( AttributeMapping attributeMapping, MutationGroupBuilder mutationGroupBuilder, From 49aee53975b74faa1c8bfde75fdf48d0c8fd9213 Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Wed, 20 Nov 2024 11:44:37 +0100 Subject: [PATCH 4/8] HHH-18854 OptionalTableUpdateOperation: change scopes and minor refactoring Allow me to remove some duplicated code in Hibernate Reactive --- .../jdbc/OptionalTableUpdateOperation.java | 82 +++++++++++-------- 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java b/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java index 52b10472b104..e213f3cc594c 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/OptionalTableUpdateOperation.java @@ -263,7 +263,10 @@ private static void bindKeyValue( } } - private JdbcDeleteMutation createJdbcDelete(SharedSessionContractImplementor session) { + /* + * Used by Hibernate Reactive + */ + protected JdbcDeleteMutation createJdbcDelete(SharedSessionContractImplementor session) { final TableDelete tableDelete; if ( tableMapping.getDeleteDetails() != null && tableMapping.getDeleteDetails().getCustomSql() != null ) { @@ -305,39 +308,7 @@ private boolean performUpdate( JdbcValueBindings jdbcValueBindings, SharedSessionContractImplementor session) { MODEL_MUTATION_LOGGER.tracef( "#performUpdate(%s)", tableMapping.getTableName() ); - - final TableUpdate tableUpdate; - if ( tableMapping.getUpdateDetails() != null - && tableMapping.getUpdateDetails().getCustomSql() != null ) { - tableUpdate = new TableUpdateCustomSql( - new MutatingTableReference( tableMapping ), - mutationTarget, - "upsert update for " + mutationTarget.getRolePath(), - valueBindings, - keyBindings, - optimisticLockBindings, - parameters - ); - } - else { - tableUpdate = new TableUpdateStandard( - new MutatingTableReference( tableMapping ), - mutationTarget, - "upsert update for " + mutationTarget.getRolePath(), - valueBindings, - keyBindings, - optimisticLockBindings, - parameters - ); - } - - final SqlAstTranslator translator = session - .getJdbcServices() - .getJdbcEnvironment() - .getSqlAstTranslatorFactory() - .buildModelMutationTranslator( tableUpdate, session.getFactory() ); - - final JdbcMutationOperation jdbcUpdate = translator.translate( null, MutationQueryOptions.INSTANCE ); + final JdbcMutationOperation jdbcUpdate = createJdbcUpdate( session ); final PreparedStatementGroupSingleTable statementGroup = new PreparedStatementGroupSingleTable( jdbcUpdate, session ); final PreparedStatementDetails statementDetails = statementGroup.resolvePreparedStatementDetails( tableMapping.getTableName() ); @@ -374,6 +345,44 @@ private boolean performUpdate( } } + /* + * Used by Hibernate Reactive + */ + protected JdbcMutationOperation createJdbcUpdate(SharedSessionContractImplementor session) { + final TableUpdate tableUpdate; + if ( tableMapping.getUpdateDetails() != null + && tableMapping.getUpdateDetails().getCustomSql() != null ) { + tableUpdate = new TableUpdateCustomSql( + new MutatingTableReference( tableMapping ), + mutationTarget, + "upsert update for " + mutationTarget.getRolePath(), + valueBindings, + keyBindings, + optimisticLockBindings, + parameters + ); + } + else { + tableUpdate = new TableUpdateStandard( + new MutatingTableReference( tableMapping ), + mutationTarget, + "upsert update for " + mutationTarget.getRolePath(), + valueBindings, + keyBindings, + optimisticLockBindings, + parameters + ); + } + + final SqlAstTranslator translator = session + .getJdbcServices() + .getJdbcEnvironment() + .getSqlAstTranslatorFactory() + .buildModelMutationTranslator( tableUpdate, session.getFactory() ); + + return translator.translate( null, MutationQueryOptions.INSTANCE ); + } + private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionContractImplementor session) { final JdbcInsertMutation jdbcInsert = createJdbcInsert( session ); @@ -414,7 +423,10 @@ private void performInsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon } } - private JdbcInsertMutation createJdbcInsert(SharedSessionContractImplementor session) { + /* + * Used by Hibernate Reactive + */ + protected JdbcInsertMutation createJdbcInsert(SharedSessionContractImplementor session) { final TableInsert tableInsert; if ( tableMapping.getInsertDetails() != null && tableMapping.getInsertDetails().getCustomSql() != null ) { From e4efafac5a8b47a2d61d481124fd8d9b7e8d6c97 Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Wed, 20 Nov 2024 14:03:26 +0100 Subject: [PATCH 5/8] HHH-18854 Allow HR to change DeleteOrUpsertOperation --- .../model/jdbc/DeleteOrUpsertOperation.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/DeleteOrUpsertOperation.java b/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/DeleteOrUpsertOperation.java index a324e5f5f475..375a4e836415 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/DeleteOrUpsertOperation.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/model/jdbc/DeleteOrUpsertOperation.java @@ -44,7 +44,6 @@ public class DeleteOrUpsertOperation implements SelfExecutingUpdateOperation { private final OptionalTableUpdate optionalTableUpdate; - public DeleteOrUpsertOperation( EntityMutationTarget mutationTarget, EntityTableMapping tableMapping, @@ -56,6 +55,16 @@ public DeleteOrUpsertOperation( this.optionalTableUpdate = optionalTableUpdate; } + /* + * Used by Hibernate Reactive + */ + protected DeleteOrUpsertOperation(DeleteOrUpsertOperation original) { + this.mutationTarget = original.mutationTarget; + this.tableMapping = original.tableMapping; + this.upsertOperation = original.upsertOperation; + this.optionalTableUpdate = original.optionalTableUpdate; + } + @Override public MutationType getMutationType() { return MutationType.UPDATE; @@ -197,4 +206,18 @@ private void performUpsert(JdbcValueBindings jdbcValueBindings, SharedSessionCon MODEL_MUTATION_LOGGER.tracef( "`%s` rows upserted into `%s`", rowCount, tableMapping.getTableName() ); } + + /* + * Used by Hibernate Reactive + */ + public UpsertOperation getUpsertOperation() { + return upsertOperation; + } + + /* + * Used by Hibernate Reactive + */ + public OptionalTableUpdate getOptionalTableUpdate() { + return optionalTableUpdate; + } } From 1e0c7481aa514bcadcdc38c4acd68a5d638d3b1b Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Fri, 22 Nov 2024 14:21:02 +0100 Subject: [PATCH 6/8] HHH-18854 JsonHelper#arrayFromString minor refactoring Change the parameter to JdbcType so that Hibernate Reactive can call it when in need to create the array. --- .../src/main/java/org/hibernate/dialect/JsonHelper.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/JsonHelper.java b/hibernate-core/src/main/java/org/hibernate/dialect/JsonHelper.java index 42c87f77cf73..40d8c0aff0a2 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/JsonHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/JsonHelper.java @@ -42,7 +42,6 @@ import org.hibernate.type.descriptor.jdbc.AggregateJdbcType; import org.hibernate.type.descriptor.jdbc.ArrayJdbcType; import org.hibernate.type.descriptor.jdbc.JdbcType; -import org.hibernate.type.descriptor.jdbc.JsonArrayJdbcType; import static org.hibernate.dialect.StructHelper.getEmbeddedPart; import static org.hibernate.dialect.StructHelper.instantiate; @@ -363,16 +362,17 @@ public static X fromString( return (X) values; } + // This is also used by Hibernate Reactive public static X arrayFromString( JavaType javaType, - JsonArrayJdbcType jsonArrayJdbcType, + JdbcType elementJdbcType, String string, WrapperOptions options) throws SQLException { if ( string == null ) { return null; } final JavaType elementJavaType = ((BasicPluralJavaType) javaType).getElementJavaType(); - final Class preferredJavaTypeClass = jsonArrayJdbcType.getElementJdbcType().getPreferredJavaTypeClass( options ); + final Class preferredJavaTypeClass = elementJdbcType.getPreferredJavaTypeClass( options ); final JavaType jdbcJavaType; if ( preferredJavaTypeClass == null || preferredJavaTypeClass == elementJavaType.getJavaTypeClass() ) { jdbcJavaType = elementJavaType; @@ -390,7 +390,7 @@ public static X arrayFromString( arrayList, elementJavaType, jdbcJavaType, - jsonArrayJdbcType.getElementJdbcType() + elementJdbcType ); assert string.charAt( i - 1 ) == ']'; return javaType.wrap( arrayList, options ); From ba3aadd2ce8b371311638256be3eb7bd12520170 Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Fri, 22 Nov 2024 14:39:38 +0100 Subject: [PATCH 7/8] HHH-18854 Revert changes for Hibernate Reactive Because I didn't add a comment, some of the methods Hibernate Reactive uses to plug in its classess, have been removed as a refactoring. --- .../internal/AbstractNonJoinedEntityFetch.java | 13 +++++++++---- .../entity/internal/EntityFetchJoinedImpl.java | 11 ++++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/AbstractNonJoinedEntityFetch.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/AbstractNonJoinedEntityFetch.java index dc657564a117..303afde07473 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/AbstractNonJoinedEntityFetch.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/AbstractNonJoinedEntityFetch.java @@ -142,11 +142,10 @@ public boolean isSelectByUniqueKey() { public DomainResultAssembler createAssembler( InitializerParent parent, AssemblerCreationState creationState) { - final EntityInitializer entityInitializer = - creationState.resolveInitializer( this, parent, this ) - .asEntityInitializer(); + final EntityInitializer entityInitializer = creationState.resolveInitializer( this, parent, this ) + .asEntityInitializer(); assert entityInitializer != null; - return new EntityAssembler<>( getFetchedMapping().getJavaType(), entityInitializer ); + return buildEntityAssembler( entityInitializer ); } @Override @@ -160,4 +159,10 @@ public EntityInitializer createInitializer( @Override public abstract EntityInitializer createInitializer(InitializerParent parent, AssemblerCreationState creationState); + /** + * Used By Hibernate Reactive + */ + protected EntityAssembler buildEntityAssembler(EntityInitializer entityInitializer) { + return new EntityAssembler<>( getFetchedMapping().getJavaType(), entityInitializer ); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchJoinedImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchJoinedImpl.java index e9e83cb5edaf..243af813c5dc 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchJoinedImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchJoinedImpl.java @@ -129,9 +129,14 @@ public FetchParent getFetchParent() { public DomainResultAssembler createAssembler( InitializerParent parent, AssemblerCreationState creationState) { - return new EntityAssembler<>( getFetchedMapping().getJavaType(), - creationState.resolveInitializer( this, parent, this ) - .asEntityInitializer() ); + return buildEntityAssembler( creationState.resolveInitializer( this, parent, this ).asEntityInitializer() ); + } + + /** + * Used by Hibernate Reactive + */ + protected EntityAssembler buildEntityAssembler(EntityInitializer entityInitializer) { + return new EntityAssembler<>( getFetchedMapping().getJavaType(), entityInitializer ); } @Override From 51f64ab4c9287ed1d8f4d66d6652f850207d69ef Mon Sep 17 00:00:00 2001 From: Davide D'Alto Date: Tue, 26 Nov 2024 12:06:12 +0100 Subject: [PATCH 8/8] HHH-18854 Remove EntityMetamodelFactory And move the `createEntityMetamodel` method in `RuntimeModelCreationContext` --- .../spi/RuntimeModelCreationContext.java | 10 +++++++ .../entity/AbstractEntityPersister.java | 29 +------------------ .../entity/JoinedSubclassEntityPersister.java | 15 +--------- .../entity/SingleTableEntityPersister.java | 15 +--------- .../entity/UnionSubclassEntityPersister.java | 14 +-------- 5 files changed, 14 insertions(+), 69 deletions(-) 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 198d3f967469..78b3ec5b7774 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,8 +14,11 @@ import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.generator.Generator; import org.hibernate.mapping.GeneratorSettings; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.sqm.function.SqmFunctionRegistry; import org.hibernate.service.ServiceRegistry; +import org.hibernate.tuple.entity.EntityMetamodel; import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry; import org.hibernate.type.spi.TypeConfiguration; @@ -64,4 +67,11 @@ default MetadataImplementor getMetadata() { Map getGenerators(); GeneratorSettings getGeneratorSettings(); + + /* + * Used by Hibernate Reactive + */ + default EntityMetamodel createEntityMetamodel(PersistentClass persistentClass, EntityPersister persister) { + return new EntityMetamodel( persistentClass, persister, this ); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index 332d6e78aa18..80811405f8cc 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -469,38 +469,11 @@ public abstract class AbstractEntityPersister private List uniqueKeyEntries = null; //lazily initialized private ConcurrentHashMap nonLazyPropertyLoadPlansByName; - /** - * A factory for the creation of an EntityMetamodel. - *

- * Hibernate Reactive uses it to pass its own entity metamodel class - * and adapt the identifier generators. - */ - public static class EntityMetamodelFactory { - public EntityMetamodel createEntityMetamodel( - PersistentClass persistentClass, - EntityPersister persister, - RuntimeModelCreationContext creationContext) { - return new EntityMetamodel( persistentClass, persister, creationContext ); - } - } - public AbstractEntityPersister( final PersistentClass persistentClass, final EntityDataAccess cacheAccessStrategy, final NaturalIdDataAccess naturalIdRegionAccessStrategy, final RuntimeModelCreationContext creationContext) throws HibernateException { - this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() ); - } - - /* - * Used by Hibernate Reactive - */ - public AbstractEntityPersister( - final PersistentClass persistentClass, - final EntityDataAccess cacheAccessStrategy, - final NaturalIdDataAccess naturalIdRegionAccessStrategy, - final RuntimeModelCreationContext creationContext, - final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException { this.jpaEntityName = persistentClass.getJpaEntityName(); //set it here, but don't call it, since it's still uninitialized! @@ -527,7 +500,7 @@ public AbstractEntityPersister( isLazyPropertiesCacheable = true; } - entityMetamodel = entityMetamodelFactory.createEntityMetamodel( persistentClass, this, creationContext ); + entityMetamodel = creationContext.createEntityMetamodel( persistentClass, this ); entityEntryFactory = entityMetamodel.isMutable() ? MutableEntityEntryFactory.INSTANCE diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java index c9cec2862919..3df9c22c93aa 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java @@ -160,20 +160,7 @@ public JoinedSubclassEntityPersister( final EntityDataAccess cacheAccessStrategy, final NaturalIdDataAccess naturalIdRegionAccessStrategy, final RuntimeModelCreationContext creationContext) throws HibernateException { - this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory()); - } - - /* - * Used by Hibernate Reactive - */ - public JoinedSubclassEntityPersister( - final PersistentClass persistentClass, - final EntityDataAccess cacheAccessStrategy, - final NaturalIdDataAccess naturalIdRegionAccessStrategy, - final RuntimeModelCreationContext creationContext, - final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException { - - super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory ); + super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext ); final Dialect dialect = creationContext.getDialect(); final SqmFunctionRegistry functionRegistry = creationContext.getFunctionRegistry(); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java index 00a2eae6d9ba..6e3563fc5a94 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java @@ -114,20 +114,7 @@ public SingleTableEntityPersister( final EntityDataAccess cacheAccessStrategy, final NaturalIdDataAccess naturalIdRegionAccessStrategy, final RuntimeModelCreationContext creationContext) throws HibernateException { - this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() ); - } - - /* - * Used by Hibernate Reactive - */ - public SingleTableEntityPersister( - final PersistentClass persistentClass, - final EntityDataAccess cacheAccessStrategy, - final NaturalIdDataAccess naturalIdRegionAccessStrategy, - final RuntimeModelCreationContext creationContext, - final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException { - - super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory ); + super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext ); final Dialect dialect = creationContext.getDialect(); final SqmFunctionRegistry functionRegistry = creationContext.getFunctionRegistry(); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java index 5386b8b7a09c..3fa14b0b64e5 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java @@ -95,19 +95,7 @@ public UnionSubclassEntityPersister( final EntityDataAccess cacheAccessStrategy, final NaturalIdDataAccess naturalIdRegionAccessStrategy, final RuntimeModelCreationContext creationContext) throws HibernateException { - this( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, new EntityMetamodelFactory() ); - } - - /* - * Used by Hibernate Reactive - */ - public UnionSubclassEntityPersister( - final PersistentClass persistentClass, - final EntityDataAccess cacheAccessStrategy, - final NaturalIdDataAccess naturalIdRegionAccessStrategy, - final RuntimeModelCreationContext creationContext, - final EntityMetamodelFactory entityMetamodelFactory) throws HibernateException { - super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext, entityMetamodelFactory ); + super( persistentClass, cacheAccessStrategy, naturalIdRegionAccessStrategy, creationContext ); validateGenerator();