From 7c80f44bfab52b0a72522aece5d122a3fbf9670a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 21 Jun 2024 15:13:28 +0200 Subject: [PATCH 1/8] Upgrade to Hibernate ORM 6.6.0.CR1 / Search 7.2.0.Alpha2 --- .../hibernate/orm/deployment/ClassNames.java | 1 + .../StatelessSessionLazyDelegator.java | 5 + .../runtime/boot/FastBootMetadataBuilder.java | 1 + .../PrevalidatedQuarkusMetadata.java | 8 + ...rkusMutableIdentifierGeneratorFactory.java | 220 ++++++++++++++---- ...sSimplifiedIdentifierGeneratorFactory.java | 208 ----------------- .../TransactionScopedStatelessSession.java | 8 + pom.xml | 6 +- 8 files changed, 202 insertions(+), 255 deletions(-) delete mode 100644 extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusSimplifiedIdentifierGeneratorFactory.java diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java index 5ea0fc42ad543..1e4c60e923ff3 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java @@ -244,6 +244,7 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.CompositeType"), createConstant("org.hibernate.annotations.CompositeTypeRegistration"), createConstant("org.hibernate.annotations.CompositeTypeRegistrations"), + createConstant("org.hibernate.annotations.ConcreteProxy"), createConstant("org.hibernate.annotations.ConverterRegistration"), createConstant("org.hibernate.annotations.ConverterRegistrations"), createConstant("org.hibernate.annotations.CreationTimestamp"), diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/StatelessSessionLazyDelegator.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/StatelessSessionLazyDelegator.java index 7315f7449a403..c0144eef0a745 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/StatelessSessionLazyDelegator.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/StatelessSessionLazyDelegator.java @@ -138,6 +138,11 @@ public void fetch(Object association) { delegate.get().fetch(association); } + @Override + public Object getIdentifier(Object entity) { + return delegate.get().getIdentifier(entity); + } + @Override public String getTenantIdentifier() { return delegate.get().getTenantIdentifier(); diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java index d6733c95501e8..11a193e7274e7 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java @@ -452,6 +452,7 @@ private PrevalidatedQuarkusMetadata trimBootstrapMetadata(MetadataImpl fullMeta) fullMeta.getEntityBindingMap(), fullMeta.getComposites(), fullMeta.getGenericComponentsMap(), + fullMeta.getEmbeddableDiscriminatorTypesMap(), fullMeta.getMappedSuperclassMap(), fullMeta.getCollectionBindingMap(), fullMeta.getTypeDefinitionMap(), diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/recording/PrevalidatedQuarkusMetadata.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/recording/PrevalidatedQuarkusMetadata.java index 9562475e330d3..35410e3c43126 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/recording/PrevalidatedQuarkusMetadata.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/recording/PrevalidatedQuarkusMetadata.java @@ -6,6 +6,7 @@ import java.util.Set; import java.util.UUID; import java.util.function.Consumer; +import java.util.function.Supplier; import org.hibernate.MappingException; import org.hibernate.SessionFactory; @@ -30,6 +31,7 @@ import org.hibernate.mapping.MappedSuperclass; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Table; +import org.hibernate.metamodel.mapping.DiscriminatorType; import org.hibernate.query.named.NamedObjectRepository; import org.hibernate.query.sqm.function.SqmFunctionDescriptor; import org.hibernate.query.sqm.function.SqmFunctionRegistry; @@ -295,6 +297,12 @@ public Component getGenericComponent(Class componentClass) { return metadata.getGenericComponent(componentClass); } + @Override + public DiscriminatorType resolveEmbeddableDiscriminatorType(Class embeddableClass, + Supplier> supplier) { + return metadata.resolveEmbeddableDiscriminatorType(embeddableClass, supplier); + } + public Map getEntityBindingMap() { return metadata.getEntityBindingMap(); } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactory.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactory.java index 1e27a72fa1be8..6ea478b7ee6e3 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactory.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactory.java @@ -1,86 +1,218 @@ package io.quarkus.hibernate.orm.runtime.service; +import static org.hibernate.cfg.AvailableSettings.IDENTIFIER_GENERATOR_STRATEGY_PROVIDER; +import static org.hibernate.id.factory.IdGenFactoryLogging.ID_GEN_FAC_LOGGER; + import java.io.Serializable; +import java.util.Locale; +import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import jakarta.persistence.GenerationType; +import org.hibernate.MappingException; +import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; +import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; +import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.dialect.Dialect; +import org.hibernate.engine.config.spi.ConfigurationService; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.generator.Generator; +import org.hibernate.id.Assigned; +import org.hibernate.id.Configurable; +import org.hibernate.id.ForeignGenerator; +import org.hibernate.id.GUIDGenerator; import org.hibernate.id.IdentifierGenerator; +import org.hibernate.id.IdentityGenerator; +import org.hibernate.id.IncrementGenerator; +import org.hibernate.id.SelectGenerator; +import org.hibernate.id.UUIDGenerator; +import org.hibernate.id.UUIDHexGenerator; +import org.hibernate.id.enhanced.SequenceStyleGenerator; +import org.hibernate.id.enhanced.TableGenerator; import org.hibernate.id.factory.IdentifierGeneratorFactory; +import org.hibernate.id.factory.internal.AutoGenerationTypeStrategy; +import org.hibernate.id.factory.internal.IdentityGenerationTypeStrategy; +import org.hibernate.id.factory.internal.SequenceGenerationTypeStrategy; +import org.hibernate.id.factory.internal.TableGenerationTypeStrategy; +import org.hibernate.id.factory.internal.UUIDGenerationTypeStrategy; +import org.hibernate.id.factory.spi.GenerationTypeStrategy; +import org.hibernate.id.factory.spi.GenerationTypeStrategyRegistration; import org.hibernate.id.factory.spi.GeneratorDefinitionResolver; +import org.hibernate.internal.log.DeprecationLogger; +import org.hibernate.jpa.spi.IdentifierGeneratorStrategyProvider; import org.hibernate.service.ServiceRegistry; import org.hibernate.type.Type; import org.hibernate.type.descriptor.java.JavaType; /** - * Wraps the default DefaultIdentifierGeneratorFactory so to make sure we store the Class references - * of any IdentifierGenerator which is accessed during the build of the Metadata. - * - * This is not to register them for reflection access: all reflective instantiation is performed - * during the build of the Metadata and is therefore safe even in native mode; - * however we still need the Class instances as some runtime operations will need these, and - * will look them up by either fully qualified name (and then reflection) or strategy name. - * - * Since all IdentifierGenerator types used by a model are accessed during the Metadata creation, - * just watching for these will provide the full list of Class instances we need to keep. + * Quarkus custom implementation of Hibernate ORM's org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory + * differences with the original: + * 1# it does not attempt to use a BeanContainer to create instances; Hibernate ORM introduced this feature in HHH-14688 + * 2# The register method is made public + * //TODO refactor ORM upstream so to allow code reuse */ public final class QuarkusMutableIdentifierGeneratorFactory implements IdentifierGeneratorFactory, Serializable { - private final QuarkusSimplifiedIdentifierGeneratorFactory original; - private final ConcurrentHashMap> typeCache = new ConcurrentHashMap<>(); + private final ServiceRegistry serviceRegistry; + private final ConcurrentHashMap generatorTypeStrategyMap = new ConcurrentHashMap<>(); + private final ConcurrentHashMap> legacyGeneratorClassNameMap = new ConcurrentHashMap<>(); + + private Dialect dialect; public QuarkusMutableIdentifierGeneratorFactory(ServiceRegistry serviceRegistry) { - this.original = new QuarkusSimplifiedIdentifierGeneratorFactory(serviceRegistry); + this.serviceRegistry = serviceRegistry; + registerJpaGenerators(); + logOverrides(); + registerPredefinedGenerators(); + registerUsingLegacyContributor(); } - @Override - public Dialect getDialect() { - return original.getDialect(); + //Same-as-upstream + private void registerJpaGenerators() { + generatorTypeStrategyMap.put(GenerationType.AUTO, AutoGenerationTypeStrategy.INSTANCE); + generatorTypeStrategyMap.put(GenerationType.SEQUENCE, SequenceGenerationTypeStrategy.INSTANCE); + generatorTypeStrategyMap.put(GenerationType.TABLE, TableGenerationTypeStrategy.INSTANCE); + generatorTypeStrategyMap.put(GenerationType.IDENTITY, IdentityGenerationTypeStrategy.INSTANCE); + generatorTypeStrategyMap.put(GenerationType.UUID, UUIDGenerationTypeStrategy.INSTANCE); } - @Override - public Generator createIdentifierGenerator(final String strategy, final Type type, final Properties config) { - final Generator identifierGenerator = original.createIdentifierGenerator(strategy, type, config); - storeCache(strategy, identifierGenerator.getClass()); - return identifierGenerator; + private void logOverrides() { + serviceRegistry.getService(ClassLoaderService.class) + .loadJavaServices(GenerationTypeStrategyRegistration.class) + .forEach((registration) -> registration.registerStrategies( + (generationType, generationTypeStrategy) -> { + final GenerationTypeStrategy previous = generatorTypeStrategyMap.put(generationType, + generationTypeStrategy); + if (previous != null) { + ID_GEN_FAC_LOGGER.debugf( + "GenerationTypeStrategyRegistration [%s] overrode previous registration for GenerationType#%s : %s", + registration, + generationType.name(), + previous); + } + }, + serviceRegistry)); + } + + //Same-as-upstream + private void registerPredefinedGenerators() { + register("uuid2", UUIDGenerator.class); + // can be done with UuidGenerator + strategy + register("guid", GUIDGenerator.class); + register("uuid", UUIDHexGenerator.class); // "deprecated" for new use + register("uuid.hex", UUIDHexGenerator.class); // uuid.hex is deprecated + register("assigned", Assigned.class); + register("identity", IdentityGenerator.class); + register("select", SelectGenerator.class); + register("sequence", SequenceStyleGenerator.class); + register("increment", IncrementGenerator.class); + register("foreign", ForeignGenerator.class); + register("enhanced-sequence", SequenceStyleGenerator.class); + register("enhanced-table", TableGenerator.class); } - private void storeCache(final String strategy, final Class generatorClass) { - if (strategy == null || generatorClass == null) - return; - final String className = generatorClass.getName(); - //Store for access both via short and long names: - typeCache.put(strategy, generatorClass); - if (!className.equals(strategy)) { - typeCache.put(className, generatorClass); + //Same-as-upstream + private void registerUsingLegacyContributor() { + final ConfigurationService configService = serviceRegistry.getService(ConfigurationService.class); + final Object providerSetting = configService.getSettings().get(IDENTIFIER_GENERATOR_STRATEGY_PROVIDER); + if (providerSetting != null) { + DeprecationLogger.DEPRECATION_LOGGER.deprecatedSetting2( + IDENTIFIER_GENERATOR_STRATEGY_PROVIDER, + "supply a org.hibernate.id.factory.spi.GenerationTypeStrategyRegistration Java service"); + final IdentifierGeneratorStrategyProvider idGeneratorStrategyProvider = serviceRegistry + .getService(StrategySelector.class) + .resolveStrategy(IdentifierGeneratorStrategyProvider.class, providerSetting); + for (Map.Entry> entry : idGeneratorStrategyProvider.getStrategies().entrySet()) { + @SuppressWarnings({ "rawtypes", "unchecked" }) + Class generatorClass = (Class) entry.getValue(); + register(entry.getKey(), generatorClass); + } } } + //Same-as-upstream - but made public public void register(String strategy, Class generatorClass) { - storeCache(strategy, generatorClass); - original.register(strategy, generatorClass); + ID_GEN_FAC_LOGGER.debugf("Registering IdentifierGenerator strategy [%s] -> [%s]", strategy, generatorClass.getName()); + final Class previous = legacyGeneratorClassNameMap.put(strategy, generatorClass); + if (previous != null && ID_GEN_FAC_LOGGER.isDebugEnabled()) { + ID_GEN_FAC_LOGGER.debugf(" - overriding [%s]", previous.getName()); + } } - @Override - public Class getIdentifierGeneratorClass(final String strategy) { - Class aClass = typeCache.get(strategy); - if (aClass != null) - return aClass; - aClass = original.getIdentifierGeneratorClass(strategy); - storeCache(strategy, aClass); - return aClass; + @Override //Same-as-upstream + public IdentifierGenerator createIdentifierGenerator( + GenerationType generationType, + String generatedValueGeneratorName, + String generatorName, + JavaType javaType, + Properties config, + GeneratorDefinitionResolver definitionResolver) { + final GenerationTypeStrategy strategy = generatorTypeStrategyMap.get(generationType); + if (strategy != null) { + return strategy.createIdentifierGenerator( + generationType, + generatorName, + javaType, + config, + definitionResolver, + serviceRegistry); + } + throw new UnsupportedOperationException("No GenerationTypeStrategy specified"); } + private Dialect getDialect() { //Same-as-upstream + if (dialect == null) { + dialect = serviceRegistry.getService(JdbcEnvironment.class).getDialect(); + } + return dialect; + } + + //Different than upstream: ignore all complexity related to it having generators + //managed by a bean container. @Override - public IdentifierGenerator createIdentifierGenerator(GenerationType generationType, - String generatedValueGeneratorName, String generatorName, JavaType javaType, Properties config, - GeneratorDefinitionResolver definitionResolver) { - return original.createIdentifierGenerator(generationType, generatedValueGeneratorName, generatorName, javaType, config, - definitionResolver); + public Generator createIdentifierGenerator(String strategy, Type type, Properties parameters) { + final Class clazz = getIdentifierGeneratorClass(strategy); + try { + final Generator identifierGenerator = clazz.getConstructor().newInstance(); + if (identifierGenerator instanceof Configurable) { + ((Configurable) identifierGenerator).configure(type, parameters, serviceRegistry); + } + return identifierGenerator; + } catch (Exception e) { + final String entityName = parameters.getProperty(IdentifierGenerator.ENTITY_NAME); + throw new MappingException("Could not instantiate id generator [entity-name=" + entityName + "]"); + } + } + + private Class getIdentifierGeneratorClass(String strategy) { //Same-as-upstream + switch (strategy) { + case "hilo": + throw new UnsupportedOperationException("Support for 'hilo' generator has been removed"); + case "native": + strategy = getDialect().getNativeIdentifierGeneratorStrategy(); + //then fall through: + default: + Class generatorClass = legacyGeneratorClassNameMap.get(strategy); + return generatorClass != null ? generatorClass : generatorClassForName(strategy); + } + } + + private Class generatorClassForName(String strategy) { //Same-as-upstream + try { + Class clazz = serviceRegistry.requireService(ClassLoaderService.class) + .classForName(strategy); + if (!Generator.class.isAssignableFrom(clazz)) { + // in principle, this shouldn't happen, since @GenericGenerator + // constrains the type to subtypes of Generator + throw new MappingException(clazz.getName() + " does not implement 'Generator'"); + } + return clazz; + } catch (ClassLoadingException e) { + throw new MappingException(String.format(Locale.ROOT, "Could not interpret id generator strategy [%s]", strategy)); + } } } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusSimplifiedIdentifierGeneratorFactory.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusSimplifiedIdentifierGeneratorFactory.java deleted file mode 100644 index 3bf480af1a2cb..0000000000000 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusSimplifiedIdentifierGeneratorFactory.java +++ /dev/null @@ -1,208 +0,0 @@ -package io.quarkus.hibernate.orm.runtime.service; - -import static org.hibernate.cfg.AvailableSettings.IDENTIFIER_GENERATOR_STRATEGY_PROVIDER; -import static org.hibernate.id.factory.IdGenFactoryLogging.ID_GEN_FAC_LOGGER; - -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; - -import jakarta.persistence.GenerationType; - -import org.hibernate.MappingException; -import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; -import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; -import org.hibernate.boot.registry.selector.spi.StrategySelector; -import org.hibernate.dialect.Dialect; -import org.hibernate.engine.config.spi.ConfigurationService; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; -import org.hibernate.generator.Generator; -import org.hibernate.id.Assigned; -import org.hibernate.id.Configurable; -import org.hibernate.id.ForeignGenerator; -import org.hibernate.id.GUIDGenerator; -import org.hibernate.id.IdentifierGenerator; -import org.hibernate.id.IdentityGenerator; -import org.hibernate.id.IncrementGenerator; -import org.hibernate.id.SelectGenerator; -import org.hibernate.id.UUIDGenerator; -import org.hibernate.id.UUIDHexGenerator; -import org.hibernate.id.enhanced.SequenceStyleGenerator; -import org.hibernate.id.enhanced.TableGenerator; -import org.hibernate.id.factory.IdentifierGeneratorFactory; -import org.hibernate.id.factory.internal.AutoGenerationTypeStrategy; -import org.hibernate.id.factory.internal.IdentityGenerationTypeStrategy; -import org.hibernate.id.factory.internal.SequenceGenerationTypeStrategy; -import org.hibernate.id.factory.internal.TableGenerationTypeStrategy; -import org.hibernate.id.factory.internal.UUIDGenerationTypeStrategy; -import org.hibernate.id.factory.spi.GenerationTypeStrategy; -import org.hibernate.id.factory.spi.GenerationTypeStrategyRegistration; -import org.hibernate.id.factory.spi.GeneratorDefinitionResolver; -import org.hibernate.internal.log.DeprecationLogger; -import org.hibernate.jpa.spi.IdentifierGeneratorStrategyProvider; -import org.hibernate.service.ServiceRegistry; -import org.hibernate.type.Type; -import org.hibernate.type.descriptor.java.JavaType; - -/** - * Quarkus custom implementation of Hibernate ORM's org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory - * differences with the original: - * 1# it does not attempt to use a BeanContainer to create instances; Hibernate ORM introduced this feature in HHH-14688 - * 2# The register method is made public - * //TODO refactor ORM upstream so to allow code reuse - */ -final class QuarkusSimplifiedIdentifierGeneratorFactory - implements IdentifierGeneratorFactory { - - private final ServiceRegistry serviceRegistry; - private final ConcurrentHashMap generatorTypeStrategyMap = new ConcurrentHashMap<>(); - private final ConcurrentHashMap> legacyGeneratorClassNameMap = new ConcurrentHashMap<>(); - - private Dialect dialect; - - public QuarkusSimplifiedIdentifierGeneratorFactory(ServiceRegistry serviceRegistry) { - this.serviceRegistry = serviceRegistry; - registerJpaGenerators(); - logOverrides(); - registerPredefinedGenerators(); - registerUsingLegacyContributor(); - } - - //Same-as-upstream - private void registerJpaGenerators() { - generatorTypeStrategyMap.put(GenerationType.AUTO, AutoGenerationTypeStrategy.INSTANCE); - generatorTypeStrategyMap.put(GenerationType.SEQUENCE, SequenceGenerationTypeStrategy.INSTANCE); - generatorTypeStrategyMap.put(GenerationType.TABLE, TableGenerationTypeStrategy.INSTANCE); - generatorTypeStrategyMap.put(GenerationType.IDENTITY, IdentityGenerationTypeStrategy.INSTANCE); - generatorTypeStrategyMap.put(GenerationType.UUID, UUIDGenerationTypeStrategy.INSTANCE); - } - - private void logOverrides() { - serviceRegistry.getService(ClassLoaderService.class) - .loadJavaServices(GenerationTypeStrategyRegistration.class) - .forEach((registration) -> registration.registerStrategies( - (generationType, generationTypeStrategy) -> { - final GenerationTypeStrategy previous = generatorTypeStrategyMap.put(generationType, - generationTypeStrategy); - if (previous != null) { - ID_GEN_FAC_LOGGER.debugf( - "GenerationTypeStrategyRegistration [%s] overrode previous registration for GenerationType#%s : %s", - registration, - generationType.name(), - previous); - } - }, - serviceRegistry)); - } - - //Same-as-upstream - private void registerPredefinedGenerators() { - register("uuid2", UUIDGenerator.class); - // can be done with UuidGenerator + strategy - register("guid", GUIDGenerator.class); - register("uuid", UUIDHexGenerator.class); // "deprecated" for new use - register("uuid.hex", UUIDHexGenerator.class); // uuid.hex is deprecated - register("assigned", Assigned.class); - register("identity", IdentityGenerator.class); - register("select", SelectGenerator.class); - register("sequence", SequenceStyleGenerator.class); - register("increment", IncrementGenerator.class); - register("foreign", ForeignGenerator.class); - register("enhanced-sequence", SequenceStyleGenerator.class); - register("enhanced-table", TableGenerator.class); - } - - //Same-as-upstream - private void registerUsingLegacyContributor() { - final ConfigurationService configService = serviceRegistry.getService(ConfigurationService.class); - final Object providerSetting = configService.getSettings().get(IDENTIFIER_GENERATOR_STRATEGY_PROVIDER); - if (providerSetting != null) { - DeprecationLogger.DEPRECATION_LOGGER.deprecatedSetting2( - IDENTIFIER_GENERATOR_STRATEGY_PROVIDER, - "supply a org.hibernate.id.factory.spi.GenerationTypeStrategyRegistration Java service"); - final IdentifierGeneratorStrategyProvider idGeneratorStrategyProvider = serviceRegistry - .getService(StrategySelector.class) - .resolveStrategy(IdentifierGeneratorStrategyProvider.class, providerSetting); - for (Map.Entry> entry : idGeneratorStrategyProvider.getStrategies().entrySet()) { - @SuppressWarnings({ "rawtypes", "unchecked" }) - Class generatorClass = (Class) entry.getValue(); - register(entry.getKey(), generatorClass); - } - } - } - - //Same-as-upstream - but made public - public void register(String strategy, Class generatorClass) { - ID_GEN_FAC_LOGGER.debugf("Registering IdentifierGenerator strategy [%s] -> [%s]", strategy, generatorClass.getName()); - final Class previous = legacyGeneratorClassNameMap.put(strategy, generatorClass); - if (previous != null && ID_GEN_FAC_LOGGER.isDebugEnabled()) { - ID_GEN_FAC_LOGGER.debugf(" - overriding [%s]", previous.getName()); - } - } - - @Override //Same-as-upstream - public IdentifierGenerator createIdentifierGenerator( - GenerationType generationType, - String generatedValueGeneratorName, - String generatorName, - JavaType javaType, - Properties config, - GeneratorDefinitionResolver definitionResolver) { - final GenerationTypeStrategy strategy = generatorTypeStrategyMap.get(generationType); - if (strategy != null) { - return strategy.createIdentifierGenerator( - generationType, - generatorName, - javaType, - config, - definitionResolver, - serviceRegistry); - } - throw new UnsupportedOperationException("No GenerationTypeStrategy specified"); - } - - @Override //Same-as-upstream - public Dialect getDialect() { - if (dialect == null) { - dialect = serviceRegistry.getService(JdbcEnvironment.class).getDialect(); - } - return dialect; - } - - //Different than upstream: ignore all complexity related to it having generators - //managed by a bean container. - @Override - public Generator createIdentifierGenerator(String strategy, Type type, Properties parameters) { - final Class clazz = getIdentifierGeneratorClass(strategy); - try { - final Generator identifierGenerator = clazz.getConstructor().newInstance(); - if (identifierGenerator instanceof Configurable) { - ((Configurable) identifierGenerator).configure(type, parameters, serviceRegistry); - } - return identifierGenerator; - } catch (Exception e) { - final String entityName = parameters.getProperty(IdentifierGenerator.ENTITY_NAME); - throw new MappingException("Could not instantiate id generator [entity-name=" + entityName + "]"); - } - } - - @Override //Same-as-upstream - public Class getIdentifierGeneratorClass(String strategy) { - if ("hilo".equals(strategy)) { - throw new UnsupportedOperationException("Support for 'hilo' generator has been removed"); - } - String resolvedStrategy = "native".equals(strategy) ? getDialect().getNativeIdentifierGeneratorStrategy() : strategy; - - Class generatorClass = legacyGeneratorClassNameMap.get(resolvedStrategy); - try { - if (generatorClass == null) { - final ClassLoaderService cls = serviceRegistry.getService(ClassLoaderService.class); - generatorClass = cls.classForName(resolvedStrategy); - } - } catch (ClassLoadingException e) { - throw new MappingException("Could not interpret id generator strategy [" + strategy + "]"); - } - return generatorClass; - } - -} diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedStatelessSession.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedStatelessSession.java index 2c12a0147b77d..9509bf924c249 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedStatelessSession.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedStatelessSession.java @@ -364,6 +364,14 @@ public void fetch(Object o) { } } + @Override + public Object getIdentifier(Object entity) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.statelessSession.getIdentifier(entity); + } + } + @Override public T get(Class entityType, Object id) { checkBlocking(); diff --git a/pom.xml b/pom.xml index f85e9d9cee4d8..c97e1efd0c9a9 100644 --- a/pom.xml +++ b/pom.xml @@ -71,13 +71,13 @@ 0.8.12 6.13.1 5.5.0 - 6.5.2.Final + 6.6.0.CR1 4.13.0 1.14.15 - 6.0.6.Final + 7.0.1.Final 2.3.1.Final 8.0.1.Final - 7.1.1.Final + 7.2.0.Alpha2 1.65.1 From b4b93ada873b74250112ec0f70362b17af59c3df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 21 Jun 2024 16:13:10 +0200 Subject: [PATCH 2/8] Remove QuarkusMutableIdentifierGeneratorFactory It no longer has a purpose: 1. We removed the type caching in a previous commit, because it wasn't used anymore: ORM hasn't needed access to generator types at runtime for a while now. 2. StandardIdentifierGeneratorFactory has a constructor parameter to disable reliance on CDI, so we don't need to rewrite that code. 3. StandardIdentifierGeneratorFactory is registering custom generators itself, so we don't need to make `register` public to register them externally. --- .../runtime/boot/FastBootMetadataBuilder.java | 31 --- ...sIdentifierGeneratorFactoryInitiator.java} | 9 +- ...rkusMutableIdentifierGeneratorFactory.java | 218 ------------------ ...dardHibernateORMInitiatorListProvider.java | 4 +- ...eactiveHibernateInitiatorListProvider.java | 6 +- 5 files changed, 9 insertions(+), 259 deletions(-) rename extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/{QuarkusMutableIdentifierGeneratorFactoryInitiator.java => QuarkusIdentifierGeneratorFactoryInitiator.java} (66%) delete mode 100644 extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactory.java diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java index 11a193e7274e7..520c8c4d25f5a 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java @@ -43,14 +43,12 @@ import org.hibernate.boot.model.process.spi.MetadataBuildingProcess; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; -import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.boot.spi.MetadataBuilderContributor; import org.hibernate.boot.spi.MetadataBuilderImplementor; import org.hibernate.cache.internal.CollectionCacheInvalidator; import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.dialect.spi.DialectFactory; -import org.hibernate.id.factory.IdentifierGeneratorFactory; import org.hibernate.integrator.spi.Integrator; import org.hibernate.internal.EntityManagerMessageLogger; import org.hibernate.internal.util.StringHelper; @@ -60,7 +58,6 @@ import org.hibernate.jpa.boot.spi.TypeContributorList; import org.hibernate.jpa.internal.util.LogHelper; import org.hibernate.jpa.internal.util.PersistenceUnitTransactionTypeHelper; -import org.hibernate.jpa.spi.IdentifierGeneratorStrategyProvider; import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode; import org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorBuilderImpl; import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl; @@ -80,7 +77,6 @@ import io.quarkus.hibernate.orm.runtime.recording.PrevalidatedQuarkusMetadata; import io.quarkus.hibernate.orm.runtime.recording.RecordableBootstrap; import io.quarkus.hibernate.orm.runtime.recording.RecordedState; -import io.quarkus.hibernate.orm.runtime.service.QuarkusMutableIdentifierGeneratorFactory; import io.quarkus.hibernate.orm.runtime.service.QuarkusStaticInitDialectFactory; import io.quarkus.hibernate.orm.runtime.tenant.HibernateMultiTenantConnectionProvider; @@ -144,7 +140,6 @@ public FastBootMetadataBuilder(final QuarkusPersistenceUnitDefinition puDefiniti ssrBuilder.applySettings(buildTimeSettings.getAllSettings()); this.standardServiceRegistry = ssrBuilder.build(); - registerIdentifierGenerators(standardServiceRegistry); this.providedServices = ssrBuilder.getProvidedServices(); @@ -615,32 +610,6 @@ private static void applyTransactionProperties(PersistenceUnitDescriptor persist } } - private void registerIdentifierGenerators(StandardServiceRegistry ssr) { - final StrategySelector strategySelector = ssr.getService(StrategySelector.class); - - // apply id generators - final Object idGeneratorStrategyProviderSetting = buildTimeSettings - .get(AvailableSettings.IDENTIFIER_GENERATOR_STRATEGY_PROVIDER); - if (idGeneratorStrategyProviderSetting != null) { - final IdentifierGeneratorStrategyProvider idGeneratorStrategyProvider = strategySelector - .resolveStrategy(IdentifierGeneratorStrategyProvider.class, idGeneratorStrategyProviderSetting); - final IdentifierGeneratorFactory identifierGeneratorFactory = ssr - .getService(IdentifierGeneratorFactory.class); - if (identifierGeneratorFactory == null) { - throw persistenceException("Application requested custom identifier generator strategies, " - + "but the MutableIdentifierGeneratorFactory could not be found"); - } - if (!(identifierGeneratorFactory instanceof QuarkusMutableIdentifierGeneratorFactory)) { - throw persistenceException( - "Unexpected implementation of IdentifierGeneratorFactory: do not override core components"); - } - final QuarkusMutableIdentifierGeneratorFactory qIdGenerator = (QuarkusMutableIdentifierGeneratorFactory) identifierGeneratorFactory; - for (Map.Entry> entry : idGeneratorStrategyProvider.getStrategies().entrySet()) { - qIdGenerator.register(entry.getKey(), entry.getValue()); - } - } - } - /** * Greatly simplified copy of * org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl#populate(org.hibernate.boot.MetadataBuilder, diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactoryInitiator.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusIdentifierGeneratorFactoryInitiator.java similarity index 66% rename from extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactoryInitiator.java rename to extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusIdentifierGeneratorFactoryInitiator.java index 0a9c5a4d4e0a4..3e9ca583f83fb 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactoryInitiator.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusIdentifierGeneratorFactoryInitiator.java @@ -4,22 +4,21 @@ import org.hibernate.boot.registry.StandardServiceInitiator; import org.hibernate.id.factory.IdentifierGeneratorFactory; +import org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory; import org.hibernate.service.spi.ServiceRegistryImplementor; /** - * We need to mimic the standard IdentifierGeneratorFactory but allowing - * to capture which Identifier strategies are being used, so that we can keep a reference to the classed - * needed at runtime. + * Uses a StandardIdentifierGeneratorFactory, but one that doesn't retrieve generators from CDI. * * @see IdentifierGeneratorFactory */ -public final class QuarkusMutableIdentifierGeneratorFactoryInitiator +public final class QuarkusIdentifierGeneratorFactoryInitiator implements StandardServiceInitiator { @Override public IdentifierGeneratorFactory initiateService(final Map configurationValues, final ServiceRegistryImplementor registry) { - return new QuarkusMutableIdentifierGeneratorFactory(registry); + return new StandardIdentifierGeneratorFactory(registry, true /* ignore bean container */); } @Override diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactory.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactory.java deleted file mode 100644 index 6ea478b7ee6e3..0000000000000 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusMutableIdentifierGeneratorFactory.java +++ /dev/null @@ -1,218 +0,0 @@ -package io.quarkus.hibernate.orm.runtime.service; - -import static org.hibernate.cfg.AvailableSettings.IDENTIFIER_GENERATOR_STRATEGY_PROVIDER; -import static org.hibernate.id.factory.IdGenFactoryLogging.ID_GEN_FAC_LOGGER; - -import java.io.Serializable; -import java.util.Locale; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; - -import jakarta.persistence.GenerationType; - -import org.hibernate.MappingException; -import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; -import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; -import org.hibernate.boot.registry.selector.spi.StrategySelector; -import org.hibernate.dialect.Dialect; -import org.hibernate.engine.config.spi.ConfigurationService; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; -import org.hibernate.generator.Generator; -import org.hibernate.id.Assigned; -import org.hibernate.id.Configurable; -import org.hibernate.id.ForeignGenerator; -import org.hibernate.id.GUIDGenerator; -import org.hibernate.id.IdentifierGenerator; -import org.hibernate.id.IdentityGenerator; -import org.hibernate.id.IncrementGenerator; -import org.hibernate.id.SelectGenerator; -import org.hibernate.id.UUIDGenerator; -import org.hibernate.id.UUIDHexGenerator; -import org.hibernate.id.enhanced.SequenceStyleGenerator; -import org.hibernate.id.enhanced.TableGenerator; -import org.hibernate.id.factory.IdentifierGeneratorFactory; -import org.hibernate.id.factory.internal.AutoGenerationTypeStrategy; -import org.hibernate.id.factory.internal.IdentityGenerationTypeStrategy; -import org.hibernate.id.factory.internal.SequenceGenerationTypeStrategy; -import org.hibernate.id.factory.internal.TableGenerationTypeStrategy; -import org.hibernate.id.factory.internal.UUIDGenerationTypeStrategy; -import org.hibernate.id.factory.spi.GenerationTypeStrategy; -import org.hibernate.id.factory.spi.GenerationTypeStrategyRegistration; -import org.hibernate.id.factory.spi.GeneratorDefinitionResolver; -import org.hibernate.internal.log.DeprecationLogger; -import org.hibernate.jpa.spi.IdentifierGeneratorStrategyProvider; -import org.hibernate.service.ServiceRegistry; -import org.hibernate.type.Type; -import org.hibernate.type.descriptor.java.JavaType; - -/** - * Quarkus custom implementation of Hibernate ORM's org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory - * differences with the original: - * 1# it does not attempt to use a BeanContainer to create instances; Hibernate ORM introduced this feature in HHH-14688 - * 2# The register method is made public - * //TODO refactor ORM upstream so to allow code reuse - */ -public final class QuarkusMutableIdentifierGeneratorFactory - implements IdentifierGeneratorFactory, Serializable { - - private final ServiceRegistry serviceRegistry; - private final ConcurrentHashMap generatorTypeStrategyMap = new ConcurrentHashMap<>(); - private final ConcurrentHashMap> legacyGeneratorClassNameMap = new ConcurrentHashMap<>(); - - private Dialect dialect; - - public QuarkusMutableIdentifierGeneratorFactory(ServiceRegistry serviceRegistry) { - this.serviceRegistry = serviceRegistry; - registerJpaGenerators(); - logOverrides(); - registerPredefinedGenerators(); - registerUsingLegacyContributor(); - } - - //Same-as-upstream - private void registerJpaGenerators() { - generatorTypeStrategyMap.put(GenerationType.AUTO, AutoGenerationTypeStrategy.INSTANCE); - generatorTypeStrategyMap.put(GenerationType.SEQUENCE, SequenceGenerationTypeStrategy.INSTANCE); - generatorTypeStrategyMap.put(GenerationType.TABLE, TableGenerationTypeStrategy.INSTANCE); - generatorTypeStrategyMap.put(GenerationType.IDENTITY, IdentityGenerationTypeStrategy.INSTANCE); - generatorTypeStrategyMap.put(GenerationType.UUID, UUIDGenerationTypeStrategy.INSTANCE); - } - - private void logOverrides() { - serviceRegistry.getService(ClassLoaderService.class) - .loadJavaServices(GenerationTypeStrategyRegistration.class) - .forEach((registration) -> registration.registerStrategies( - (generationType, generationTypeStrategy) -> { - final GenerationTypeStrategy previous = generatorTypeStrategyMap.put(generationType, - generationTypeStrategy); - if (previous != null) { - ID_GEN_FAC_LOGGER.debugf( - "GenerationTypeStrategyRegistration [%s] overrode previous registration for GenerationType#%s : %s", - registration, - generationType.name(), - previous); - } - }, - serviceRegistry)); - } - - //Same-as-upstream - private void registerPredefinedGenerators() { - register("uuid2", UUIDGenerator.class); - // can be done with UuidGenerator + strategy - register("guid", GUIDGenerator.class); - register("uuid", UUIDHexGenerator.class); // "deprecated" for new use - register("uuid.hex", UUIDHexGenerator.class); // uuid.hex is deprecated - register("assigned", Assigned.class); - register("identity", IdentityGenerator.class); - register("select", SelectGenerator.class); - register("sequence", SequenceStyleGenerator.class); - register("increment", IncrementGenerator.class); - register("foreign", ForeignGenerator.class); - register("enhanced-sequence", SequenceStyleGenerator.class); - register("enhanced-table", TableGenerator.class); - } - - //Same-as-upstream - private void registerUsingLegacyContributor() { - final ConfigurationService configService = serviceRegistry.getService(ConfigurationService.class); - final Object providerSetting = configService.getSettings().get(IDENTIFIER_GENERATOR_STRATEGY_PROVIDER); - if (providerSetting != null) { - DeprecationLogger.DEPRECATION_LOGGER.deprecatedSetting2( - IDENTIFIER_GENERATOR_STRATEGY_PROVIDER, - "supply a org.hibernate.id.factory.spi.GenerationTypeStrategyRegistration Java service"); - final IdentifierGeneratorStrategyProvider idGeneratorStrategyProvider = serviceRegistry - .getService(StrategySelector.class) - .resolveStrategy(IdentifierGeneratorStrategyProvider.class, providerSetting); - for (Map.Entry> entry : idGeneratorStrategyProvider.getStrategies().entrySet()) { - @SuppressWarnings({ "rawtypes", "unchecked" }) - Class generatorClass = (Class) entry.getValue(); - register(entry.getKey(), generatorClass); - } - } - } - - //Same-as-upstream - but made public - public void register(String strategy, Class generatorClass) { - ID_GEN_FAC_LOGGER.debugf("Registering IdentifierGenerator strategy [%s] -> [%s]", strategy, generatorClass.getName()); - final Class previous = legacyGeneratorClassNameMap.put(strategy, generatorClass); - if (previous != null && ID_GEN_FAC_LOGGER.isDebugEnabled()) { - ID_GEN_FAC_LOGGER.debugf(" - overriding [%s]", previous.getName()); - } - } - - @Override //Same-as-upstream - public IdentifierGenerator createIdentifierGenerator( - GenerationType generationType, - String generatedValueGeneratorName, - String generatorName, - JavaType javaType, - Properties config, - GeneratorDefinitionResolver definitionResolver) { - final GenerationTypeStrategy strategy = generatorTypeStrategyMap.get(generationType); - if (strategy != null) { - return strategy.createIdentifierGenerator( - generationType, - generatorName, - javaType, - config, - definitionResolver, - serviceRegistry); - } - throw new UnsupportedOperationException("No GenerationTypeStrategy specified"); - } - - private Dialect getDialect() { //Same-as-upstream - if (dialect == null) { - dialect = serviceRegistry.getService(JdbcEnvironment.class).getDialect(); - } - return dialect; - } - - //Different than upstream: ignore all complexity related to it having generators - //managed by a bean container. - @Override - public Generator createIdentifierGenerator(String strategy, Type type, Properties parameters) { - final Class clazz = getIdentifierGeneratorClass(strategy); - try { - final Generator identifierGenerator = clazz.getConstructor().newInstance(); - if (identifierGenerator instanceof Configurable) { - ((Configurable) identifierGenerator).configure(type, parameters, serviceRegistry); - } - return identifierGenerator; - } catch (Exception e) { - final String entityName = parameters.getProperty(IdentifierGenerator.ENTITY_NAME); - throw new MappingException("Could not instantiate id generator [entity-name=" + entityName + "]"); - } - } - - private Class getIdentifierGeneratorClass(String strategy) { //Same-as-upstream - switch (strategy) { - case "hilo": - throw new UnsupportedOperationException("Support for 'hilo' generator has been removed"); - case "native": - strategy = getDialect().getNativeIdentifierGeneratorStrategy(); - //then fall through: - default: - Class generatorClass = legacyGeneratorClassNameMap.get(strategy); - return generatorClass != null ? generatorClass : generatorClassForName(strategy); - } - } - - private Class generatorClassForName(String strategy) { //Same-as-upstream - try { - Class clazz = serviceRegistry.requireService(ClassLoaderService.class) - .classForName(strategy); - if (!Generator.class.isAssignableFrom(clazz)) { - // in principle, this shouldn't happen, since @GenericGenerator - // constrains the type to subtypes of Generator - throw new MappingException(clazz.getName() + " does not implement 'Generator'"); - } - return clazz; - } catch (ClassLoadingException e) { - throw new MappingException(String.format(Locale.ROOT, "Could not interpret id generator strategy [%s]", strategy)); - } - } - -} diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/StandardHibernateORMInitiatorListProvider.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/StandardHibernateORMInitiatorListProvider.java index 04eaa9f9f032d..c62e699c6bced 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/StandardHibernateORMInitiatorListProvider.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/StandardHibernateORMInitiatorListProvider.java @@ -82,8 +82,8 @@ public List> initialInitiatorList() { serviceInitiators.add(JdbcServicesInitiator.INSTANCE); serviceInitiators.add(RefCursorSupportInitiator.INSTANCE); - // Custom one! Also, this one has state so can't use the singleton. - serviceInitiators.add(new QuarkusMutableIdentifierGeneratorFactoryInitiator());// MutableIdentifierGeneratorFactoryInitiator.INSTANCE); + // Custom one! + serviceInitiators.add(new QuarkusIdentifierGeneratorFactoryInitiator()); serviceInitiators.add(QuarkusJtaPlatformInitiator.INSTANCE); diff --git a/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/boot/registry/ReactiveHibernateInitiatorListProvider.java b/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/boot/registry/ReactiveHibernateInitiatorListProvider.java index 169b52a90d19e..be536c8c7b278 100644 --- a/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/boot/registry/ReactiveHibernateInitiatorListProvider.java +++ b/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/boot/registry/ReactiveHibernateInitiatorListProvider.java @@ -33,8 +33,8 @@ import io.quarkus.hibernate.orm.runtime.customized.BootstrapOnlyProxyFactoryFactoryInitiator; import io.quarkus.hibernate.orm.runtime.customized.QuarkusJndiServiceInitiator; import io.quarkus.hibernate.orm.runtime.service.InitialInitiatorListProvider; +import io.quarkus.hibernate.orm.runtime.service.QuarkusIdentifierGeneratorFactoryInitiator; import io.quarkus.hibernate.orm.runtime.service.QuarkusImportSqlCommandExtractorInitiator; -import io.quarkus.hibernate.orm.runtime.service.QuarkusMutableIdentifierGeneratorFactoryInitiator; import io.quarkus.hibernate.orm.runtime.service.QuarkusRegionFactoryInitiator; import io.quarkus.hibernate.orm.runtime.service.QuarkusStaticInitDialectFactoryInitiator; import io.quarkus.hibernate.orm.runtime.service.StandardHibernateORMInitiatorListProvider; @@ -96,8 +96,8 @@ public List> initialInitiatorList() { serviceInitiators.add(JdbcServicesInitiator.INSTANCE); serviceInitiators.add(RefCursorSupportInitiator.INSTANCE); - // Custom one! Also, this one has state so can't use the singleton. - serviceInitiators.add(new QuarkusMutableIdentifierGeneratorFactoryInitiator());// MutableIdentifierGeneratorFactoryInitiator.INSTANCE); + // Custom one! + serviceInitiators.add(new QuarkusIdentifierGeneratorFactoryInitiator()); // Custom for Hibernate Reactive: serviceInitiators.add(NoJtaPlatformInitiator.INSTANCE); From 0931112d15f4a72424999f9d3e146eef850b7408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Tue, 25 Jun 2024 10:24:22 +0200 Subject: [PATCH 3/8] Work around HHH-18285 in tests See https://hibernate.atlassian.net/browse/HHH-18285 --- ...teEntityEnhancerPresentEmbeddableTest.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/enhancer/HibernateEntityEnhancerPresentEmbeddableTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/enhancer/HibernateEntityEnhancerPresentEmbeddableTest.java index 789b88ff5fb32..4f9fd280eb32d 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/enhancer/HibernateEntityEnhancerPresentEmbeddableTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/enhancer/HibernateEntityEnhancerPresentEmbeddableTest.java @@ -229,7 +229,6 @@ public void setEmbeddableMapValueWithAnnotation( } @Embeddable - @MappedSuperclass public static class EmbeddableWithAnnotation { private String text; @@ -283,8 +282,29 @@ public void setEmbedded(EmbeddableWithAnnotation embedded) { } } + @MappedSuperclass + public static abstract class MappedSuperclassForEmbeddable { + private String text; + + protected MappedSuperclassForEmbeddable() { + // For Hibernate ORM only - it will change the property value through reflection + } + + public MappedSuperclassForEmbeddable(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + } + @Embeddable - public static class ExtendedEmbeddableWithAnnotation extends EmbeddableWithAnnotation { + public static class ExtendedEmbeddableWithAnnotation extends MappedSuperclassForEmbeddable { private Integer integer; protected ExtendedEmbeddableWithAnnotation() { From c95d765ff94249e37e03cc2326243654a4bca306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Mon, 1 Jul 2024 10:26:18 +0200 Subject: [PATCH 4/8] Work around https://hibernate.atlassian.net/browse/HHH-18284 --- .../io/quarkus/hibernate/orm/deployment/ClassNames.java | 4 ++++ .../hibernate/orm/deployment/GraalVMFeatures.java | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java index 1e4c60e923ff3..5a368bb193981 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java @@ -83,6 +83,10 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.tuple.UpdateTimestampGeneration"), createConstant("org.hibernate.tuple.VmValueGeneration")); + public static final List EXTRA_EVENT_LISTENERS = List.of( + createConstant("org.hibernate.event.spi.PreUpsertEventListener"), + createConstant("org.hibernate.event.spi.PostUpsertEventListener")); + public static final List PACKAGE_ANNOTATIONS = List.of( createConstant("org.hibernate.annotations.CollectionTypeRegistration"), createConstant("org.hibernate.annotations.CompositeTypeRegistration"), diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/GraalVMFeatures.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/GraalVMFeatures.java index 59ccbbc5a94ed..c94691ddd09e9 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/GraalVMFeatures.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/GraalVMFeatures.java @@ -1,5 +1,6 @@ package io.quarkus.hibernate.orm.deployment; +import static io.quarkus.hibernate.orm.deployment.ClassNames.EXTRA_EVENT_LISTENERS; import static io.quarkus.hibernate.orm.deployment.ClassNames.GENERATORS; import org.jboss.jandex.DotName; @@ -21,6 +22,14 @@ NativeImageFeatureBuildItem staticNativeImageFeature() { return new NativeImageFeatureBuildItem("org.hibernate.graalvm.internal.GraalVMStaticFeature"); } + // Workaround for https://hibernate.atlassian.net/browse/HHH-18284 + @BuildStep + ReflectiveClassBuildItem registerMissingListenerClassesForReflections() { + return ReflectiveClassBuildItem + .builder(EXTRA_EVENT_LISTENERS.stream().map(d -> d.toString() + "[]").toArray(String[]::new)) + .build(); + } + // Workaround for https://hibernate.atlassian.net/browse/HHH-16439 @BuildStep ReflectiveClassBuildItem registerGeneratorClassesForReflections() { From c4915a89d205478024f70b5a8a6a10ed307a729f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 1 Aug 2024 11:49:06 +0200 Subject: [PATCH 5/8] Introduce a dedicated Hibernate ORM connection provider for static init Since the database is not available during static init, the connection provider is just a stub that will fail on connection retrieval. This doesn't change anything functionally, but is a safer setup that will avoid problems such as the one we have with logging of DB info: https://hibernate.zulipchat.com/#narrow/stream/132094-hibernate-orm-dev/topic/HHH-18224.20Log.20DB.20info --- .../PreconfiguredServiceRegistryBuilder.java | 2 +- .../QuarkusConnectionProviderInitiator.java | 3 +- .../QuarkusStaticInitConnectionProvider.java | 40 +++++++++++++++++++ ...StaticInitConnectionProviderInitiator.java | 29 ++++++++++++++ ...dardHibernateORMInitiatorListProvider.java | 3 +- 5 files changed, 73 insertions(+), 4 deletions(-) rename extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/{customized => service}/QuarkusConnectionProviderInitiator.java (94%) create mode 100644 extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusStaticInitConnectionProvider.java create mode 100644 extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusStaticInitConnectionProviderInitiator.java diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/registry/PreconfiguredServiceRegistryBuilder.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/registry/PreconfiguredServiceRegistryBuilder.java index 01086814f5d9a..a94a56ce262ee 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/registry/PreconfiguredServiceRegistryBuilder.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/registry/PreconfiguredServiceRegistryBuilder.java @@ -33,7 +33,6 @@ import org.hibernate.tool.schema.internal.SchemaManagementToolInitiator; import io.quarkus.hibernate.orm.runtime.cdi.QuarkusManagedBeanRegistryInitiator; -import io.quarkus.hibernate.orm.runtime.customized.QuarkusConnectionProviderInitiator; import io.quarkus.hibernate.orm.runtime.customized.QuarkusJndiServiceInitiator; import io.quarkus.hibernate.orm.runtime.customized.QuarkusJtaPlatformInitiator; import io.quarkus.hibernate.orm.runtime.customized.QuarkusRuntimeProxyFactoryFactory; @@ -41,6 +40,7 @@ import io.quarkus.hibernate.orm.runtime.recording.RecordedState; import io.quarkus.hibernate.orm.runtime.service.CfgXmlAccessServiceInitiatorQuarkus; import io.quarkus.hibernate.orm.runtime.service.FlatClassLoaderService; +import io.quarkus.hibernate.orm.runtime.service.QuarkusConnectionProviderInitiator; import io.quarkus.hibernate.orm.runtime.service.QuarkusImportSqlCommandExtractorInitiator; import io.quarkus.hibernate.orm.runtime.service.QuarkusMutationExecutorServiceInitiator; import io.quarkus.hibernate.orm.runtime.service.QuarkusRegionFactoryInitiator; diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusConnectionProviderInitiator.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusConnectionProviderInitiator.java similarity index 94% rename from extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusConnectionProviderInitiator.java rename to extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusConnectionProviderInitiator.java index b0bcb51372dae..1888bd515c84a 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusConnectionProviderInitiator.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusConnectionProviderInitiator.java @@ -1,4 +1,4 @@ -package io.quarkus.hibernate.orm.runtime.customized; +package io.quarkus.hibernate.orm.runtime.service; import java.util.Map; @@ -10,6 +10,7 @@ import org.hibernate.service.spi.ServiceRegistryImplementor; import io.agroal.api.AgroalDataSource; +import io.quarkus.hibernate.orm.runtime.customized.QuarkusConnectionProvider; import io.quarkus.hibernate.orm.runtime.migration.MultiTenancyStrategy; public final class QuarkusConnectionProviderInitiator implements StandardServiceInitiator { diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusStaticInitConnectionProvider.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusStaticInitConnectionProvider.java new file mode 100644 index 0000000000000..66450d785ba98 --- /dev/null +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusStaticInitConnectionProvider.java @@ -0,0 +1,40 @@ +package io.quarkus.hibernate.orm.runtime.service; + +import java.sql.Connection; +import java.sql.SQLException; + +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; +import org.hibernate.service.UnknownUnwrapTypeException; + +public class QuarkusStaticInitConnectionProvider implements ConnectionProvider { + @Override + public Connection getConnection() throws SQLException { + throw new UnsupportedOperationException( + "Cannot retrieve a connection to the database during Quarkus' static initialization. Delay the connection retrieval until runtime."); + } + + @Override + public void closeConnection(Connection connection) throws SQLException { + // Should not be called, since getting a connection is impossible. + } + + @Override + public boolean supportsAggressiveRelease() { + return false; + } + + @Override + public boolean isUnwrappableAs(final Class unwrapType) { + return ConnectionProvider.class.equals(unwrapType); + } + + @Override + @SuppressWarnings("unchecked") + public T unwrap(final Class unwrapType) { + if (ConnectionProvider.class.equals(unwrapType)) { + return (T) this; + } else { + throw new UnknownUnwrapTypeException(unwrapType); + } + } +} diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusStaticInitConnectionProviderInitiator.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusStaticInitConnectionProviderInitiator.java new file mode 100644 index 0000000000000..ee7fc2b0a5267 --- /dev/null +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusStaticInitConnectionProviderInitiator.java @@ -0,0 +1,29 @@ +package io.quarkus.hibernate.orm.runtime.service; + +import java.util.Map; + +import org.hibernate.boot.registry.StandardServiceInitiator; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; +import org.hibernate.service.spi.ServiceRegistryImplementor; + +/** + * Initializes the connection provider during static init. + *

+ * Since the database is not available during static init, + * the connection provider is just a stub that will fail on connection retrieval. + */ +public final class QuarkusStaticInitConnectionProviderInitiator implements StandardServiceInitiator { + + public static final QuarkusStaticInitConnectionProviderInitiator INSTANCE = new QuarkusStaticInitConnectionProviderInitiator(); + + @Override + public Class getServiceInitiated() { + return ConnectionProvider.class; + } + + @Override + public ConnectionProvider initiateService(Map configurationValues, ServiceRegistryImplementor registry) { + return new QuarkusStaticInitConnectionProvider(); + } + +} diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/StandardHibernateORMInitiatorListProvider.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/StandardHibernateORMInitiatorListProvider.java index c62e699c6bced..d84ce1479e999 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/StandardHibernateORMInitiatorListProvider.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/StandardHibernateORMInitiatorListProvider.java @@ -27,7 +27,6 @@ import io.quarkus.hibernate.orm.runtime.cdi.QuarkusManagedBeanRegistryInitiator; import io.quarkus.hibernate.orm.runtime.customized.BootstrapOnlyProxyFactoryFactoryInitiator; -import io.quarkus.hibernate.orm.runtime.customized.QuarkusConnectionProviderInitiator; import io.quarkus.hibernate.orm.runtime.customized.QuarkusJndiServiceInitiator; import io.quarkus.hibernate.orm.runtime.customized.QuarkusJtaPlatformInitiator; @@ -71,7 +70,7 @@ public List> initialInitiatorList() { serviceInitiators.add(PersisterFactoryInitiator.INSTANCE); // Custom one! - serviceInitiators.add(QuarkusConnectionProviderInitiator.INSTANCE); + serviceInitiators.add(QuarkusStaticInitConnectionProviderInitiator.INSTANCE); serviceInitiators.add(MultiTenantConnectionProviderInitiator.INSTANCE); serviceInitiators.add(DialectResolverInitiator.INSTANCE); From 235f0a7535f8f1c50703804a1a59cdf27560994d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 1 Aug 2024 12:00:40 +0200 Subject: [PATCH 6/8] Upgrade to Hibernate ORM 6.6.0.CR2, Reactive 2.4.0.CR1, Search 7.2.0.CR1 --- .../orm/deployment/HibernateLogFilterBuildStep.java | 7 +++++++ pom.xml | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateLogFilterBuildStep.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateLogFilterBuildStep.java index 2dffe9d53f761..1cbae172136e7 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateLogFilterBuildStep.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateLogFilterBuildStep.java @@ -31,6 +31,13 @@ void setupLogFilters(BuildProducer filters) { filters.produce(new LogCleanupFilterBuildItem("org.hibernate.orm.incubating", "HHH90006001")); + // Silence DB connection info logging because: + // 1. We don't implement the retrieval of information in QuarkusConnectionProvider + // 2. It's currently being logged even at static init when there is no connection + // See https://hibernate.atlassian.net/browse/HHH-18454 + filters.produce(new LogCleanupFilterBuildItem("org.hibernate.orm.connections.pooling", + "HHH10001005")); + //This "deprecation" warning isn't practical for the specific Quarkus needs, as it reminds users they don't need //to set the 'hibernate.dialect' property, however it's being set by Quarkus buildsteps so they can't avoid it. //Ignore for now, perhaps remove it upstream however this may make sense for other Hibernate users. diff --git a/pom.xml b/pom.xml index c97e1efd0c9a9..cfc9f3570687e 100644 --- a/pom.xml +++ b/pom.xml @@ -71,13 +71,13 @@ 0.8.12 6.13.1 5.5.0 - 6.6.0.CR1 + 6.6.0.CR2 4.13.0 - 1.14.15 + 1.14.18 7.0.1.Final - 2.3.1.Final + 2.4.0.CR1 8.0.1.Final - 7.2.0.Alpha2 + 7.2.0.CR1 1.65.1 From 699708a1f16dba9f08db5f69e1c50a565cdd2849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 1 Aug 2024 09:42:14 +0200 Subject: [PATCH 7/8] Revert "Work around https://hibernate.atlassian.net/browse/HHH-18284" This reverts commit 20940a56279b324da14d17a6a498a936ece7fd0c. --- .../io/quarkus/hibernate/orm/deployment/ClassNames.java | 4 ---- .../hibernate/orm/deployment/GraalVMFeatures.java | 9 --------- 2 files changed, 13 deletions(-) diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java index 5a368bb193981..1e4c60e923ff3 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java @@ -83,10 +83,6 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.tuple.UpdateTimestampGeneration"), createConstant("org.hibernate.tuple.VmValueGeneration")); - public static final List EXTRA_EVENT_LISTENERS = List.of( - createConstant("org.hibernate.event.spi.PreUpsertEventListener"), - createConstant("org.hibernate.event.spi.PostUpsertEventListener")); - public static final List PACKAGE_ANNOTATIONS = List.of( createConstant("org.hibernate.annotations.CollectionTypeRegistration"), createConstant("org.hibernate.annotations.CompositeTypeRegistration"), diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/GraalVMFeatures.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/GraalVMFeatures.java index c94691ddd09e9..59ccbbc5a94ed 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/GraalVMFeatures.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/GraalVMFeatures.java @@ -1,6 +1,5 @@ package io.quarkus.hibernate.orm.deployment; -import static io.quarkus.hibernate.orm.deployment.ClassNames.EXTRA_EVENT_LISTENERS; import static io.quarkus.hibernate.orm.deployment.ClassNames.GENERATORS; import org.jboss.jandex.DotName; @@ -22,14 +21,6 @@ NativeImageFeatureBuildItem staticNativeImageFeature() { return new NativeImageFeatureBuildItem("org.hibernate.graalvm.internal.GraalVMStaticFeature"); } - // Workaround for https://hibernate.atlassian.net/browse/HHH-18284 - @BuildStep - ReflectiveClassBuildItem registerMissingListenerClassesForReflections() { - return ReflectiveClassBuildItem - .builder(EXTRA_EVENT_LISTENERS.stream().map(d -> d.toString() + "[]").toArray(String[]::new)) - .build(); - } - // Workaround for https://hibernate.atlassian.net/browse/HHH-16439 @BuildStep ReflectiveClassBuildItem registerGeneratorClassesForReflections() { From 09706de2ee258aada79993cea7b1b4f3ab42c22b Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Fri, 9 Aug 2024 16:29:13 +0200 Subject: [PATCH 8/8] Upgrade to Hibernate ORM 6.6.0.Final, Reactive 2.4.0.Final, Search 7.2.0.Final --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index cfc9f3570687e..279ac73be790a 100644 --- a/pom.xml +++ b/pom.xml @@ -71,13 +71,13 @@ 0.8.12 6.13.1 5.5.0 - 6.6.0.CR2 + 6.6.0.Final 4.13.0 1.14.18 7.0.1.Final - 2.4.0.CR1 + 2.4.0.Final 8.0.1.Final - 7.2.0.CR1 + 7.2.0.Final 1.65.1