diff --git a/bom/application/pom.xml b/bom/application/pom.xml index 83ffecb747466..e635fec888aa2 100644 --- a/bom/application/pom.xml +++ b/bom/application/pom.xml @@ -95,12 +95,12 @@ 1.18.0 1.7.0 + hibernate-search.version, antlr.version, bytebuddy.version --> 7.2.2.Final 1.0.0.Final 2.7.1 8.0.0.Final - 8.18.2 + 9.0.2 2.2.21 2.2.5.Final 2.2.2.SP01 @@ -1284,6 +1284,16 @@ quarkus-hibernate-orm-deployment ${project.version} + + io.quarkus + quarkus-hibernate-orm-derby + ${project.version} + + + io.quarkus + quarkus-hibernate-orm-derby-deployment + ${project.version} + io.quarkus quarkus-hibernate-envers @@ -5474,13 +5484,6 @@ org.hibernate.orm hibernate-core ${hibernate-orm.version} - - - - io.smallrye - jandex - - org.hibernate.orm @@ -5492,6 +5495,11 @@ hibernate-envers ${hibernate-orm.version} + + org.hibernate.orm + hibernate-processor + ${hibernate-orm.version} + org.hibernate.orm hibernate-jpamodelgen @@ -5506,9 +5514,9 @@ ${hibernate-orm.version} - org.hibernate.common - hibernate-commons-annotations - ${hibernate-commons-annotations.version} + org.hibernate.models + hibernate-models + ${hibernate-models.version} org.hibernate.orm @@ -5545,6 +5553,10 @@ io.smallrye jandex + + org.hibernate.models + hibernate-models-jandex + @@ -5569,6 +5581,10 @@ io.smallrye jandex + + org.hibernate.models + hibernate-models-jandex + @@ -5678,11 +5694,11 @@ co.elastic.clients elasticsearch-java ${elasticsearch-opensource-components.version} - + - org.apache.logging.log4j - log4j-core + commons-logging + commons-logging diff --git a/build-parent/pom.xml b/build-parent/pom.xml index aef580f15bbaa..142d857c4f877 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -73,12 +73,12 @@ :Z - 8.18.2 + 9.0.2 docker.io/elastic/elasticsearch:${elasticsearch-server.version} docker.io/elastic/logstash:${elasticsearch-server.version} docker.io/elastic/kibana:${elasticsearch-server.version} http - 2.16.0 + 3.0.0 docker.io/opensearchproject/opensearch:${opensearch-server.version} http 2.2.0 diff --git a/devtools/bom-descriptor-json/pom.xml b/devtools/bom-descriptor-json/pom.xml index 1d708f3aa6272..ad2740e7f6e00 100644 --- a/devtools/bom-descriptor-json/pom.xml +++ b/devtools/bom-descriptor-json/pom.xml @@ -850,6 +850,19 @@ + + io.quarkus + quarkus-hibernate-orm-derby + ${project.version} + pom + test + + + * + * + + + io.quarkus quarkus-hibernate-orm-panache diff --git a/docs/pom.xml b/docs/pom.xml index f2a1e95944fd8..ca6182baba719 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -859,6 +859,19 @@ + + io.quarkus + quarkus-hibernate-orm-derby-deployment + ${project.version} + pom + test + + + * + * + + + io.quarkus quarkus-hibernate-orm-panache-deployment diff --git a/docs/src/main/asciidoc/hibernate-orm.adoc b/docs/src/main/asciidoc/hibernate-orm.adoc index a8297e5bfe43b..582fbac318621 100644 --- a/docs/src/main/asciidoc/hibernate-orm.adoc +++ b/docs/src/main/asciidoc/hibernate-orm.adoc @@ -515,7 +515,7 @@ HibernateCriteriaBuilder hibernateCriteriaBuilder; Metamodel metamodel; @Inject -Cache cache; +jakarta.persistence.Cache cache; @Inject org.hibernate.Cache cache; @@ -523,6 +523,9 @@ org.hibernate.Cache cache; @Inject jakarta.persistence.PersistenceUnitUtil persistenceUnitUtil; +@Inject +jakarta.persistence.SchemaManager schemaManager; + @Inject org.hibernate.relational.SchemaManager schemaManager; ---- @@ -1692,8 +1695,8 @@ section of the Hibernate Validator guide for more details. == Static metamodel and Jakarta Data Both static metamodel and Jakarta Data capabilities of Hibernate ORM are available in Quarkus -through the `hibernate-jpamodelgen` annotation processor. Since it is an annotation processor, -you must configure the annotation processor in your build tool: +through the `hibernate-processor` annotation processor. Since it is an annotation processor, +you must configure it accordingly in your build tool: [source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"] .pom.xml @@ -1704,7 +1707,7 @@ you must configure the annotation processor in your build tool: org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor @@ -1718,9 +1721,9 @@ you must configure the annotation processor in your build tool: .build.gradle ---- // Enforce the version management of your annotation processor dependencies, -// so that there's no need to define an explicit version of the hibernate-jpamodelgen +// so that there's no need to define an explicit version of the hibernate-processor annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}") -annotationProcessor 'org.hibernate.orm:hibernate-jpamodelgen' +annotationProcessor 'org.hibernate.orm:hibernate-processor' ---- === Static metamodel @@ -1757,7 +1760,7 @@ For a more detailed overview of static metamodel, please refer to the link:{jaka === Jakarta Data -Jakarta Data requires, besides having the `hibernate-jpamodelgen` annotation processor in place, one extra dependency to be added: +Jakarta Data requires, besides having the `hibernate-processor` annotation processor in place, one extra dependency to be added: [source,xml,role="primary asciidoc-tabs-target-sync-cli asciidoc-tabs-target-sync-maven"] .pom.xml diff --git a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc index 330b67b188db3..521d7a0391385 100644 --- a/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc +++ b/docs/src/main/asciidoc/hibernate-search-orm-elasticsearch.adoc @@ -631,7 +631,7 @@ quarkus.datasource.db-kind=postgresql <1> quarkus.hibernate-orm.sql-load-script=import.sql <2> -quarkus.hibernate-search-orm.elasticsearch.version=8 <3> +quarkus.hibernate-search-orm.elasticsearch.version=9 <3> quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy=sync <4> %prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost/quarkus_test @@ -820,7 +820,7 @@ as shown below. [source,properties] ---- -quarkus.hibernate-search-orm.elasticsearch.version=opensearch:2.16 +quarkus.hibernate-search-orm.elasticsearch.version=opensearch:3.0 ---- All other configuration options and APIs are exactly the same as with Elasticsearch. @@ -850,7 +850,7 @@ quarkus.datasource.db-kind=h2 quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1 quarkus.hibernate-search-orm.elasticsearch.hosts=es1.mycompany.com:9200 -quarkus.hibernate-search-orm.elasticsearch.version=8 +quarkus.hibernate-search-orm.elasticsearch.version=9 ---- Using a map based approach, it is also possible to configure named persistence units: @@ -870,10 +870,10 @@ quarkus.hibernate-orm."inventory".datasource=inventory <4> quarkus.hibernate-orm."inventory".packages=org.acme.model.inventory quarkus.hibernate-search-orm."users".elasticsearch.hosts=es1.mycompany.com:9200 <5> -quarkus.hibernate-search-orm."users".elasticsearch.version=8 +quarkus.hibernate-search-orm."users".elasticsearch.version=9 quarkus.hibernate-search-orm."inventory".elasticsearch.hosts=es2.mycompany.com:9200 <6> -quarkus.hibernate-search-orm."inventory".elasticsearch.version=8 +quarkus.hibernate-search-orm."inventory".elasticsearch.version=9 ---- <1> Define a datasource named `users`. <2> Define a datasource named `inventory`. diff --git a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc index fc4f742d8c1c1..3763e4c208b3a 100644 --- a/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc +++ b/docs/src/main/asciidoc/hibernate-search-standalone-elasticsearch.adoc @@ -560,7 +560,7 @@ Edit `src/main/resources/application.properties` and inject the following config [source,properties] ---- quarkus.hibernate-search-standalone.mapping.structure=document <1> -quarkus.hibernate-search-standalone.elasticsearch.version=8 <2> +quarkus.hibernate-search-standalone.elasticsearch.version=9 <2> quarkus.hibernate-search-standalone.indexing.plan.synchronization.strategy=sync <3> %prod.quarkus.hibernate-search-standalone.elasticsearch.hosts=localhost:9200 <4> @@ -738,7 +738,7 @@ as shown below. [source,properties] ---- -quarkus.hibernate-search-standalone.elasticsearch.version=opensearch:2.16 +quarkus.hibernate-search-standalone.elasticsearch.version=opensearch:3.0 ---- All other configuration options and APIs are exactly the same as with Elasticsearch. diff --git a/extensions/elasticsearch-rest-client/runtime/src/main/java/io/quarkus/elasticsearch/restclient/lowlevel/runtime/ElasticsearchConfig.java b/extensions/elasticsearch-rest-client/runtime/src/main/java/io/quarkus/elasticsearch/restclient/lowlevel/runtime/ElasticsearchConfig.java index 6b4ccf0fc04dd..8ea7623d5918b 100644 --- a/extensions/elasticsearch-rest-client/runtime/src/main/java/io/quarkus/elasticsearch/restclient/lowlevel/runtime/ElasticsearchConfig.java +++ b/extensions/elasticsearch-rest-client/runtime/src/main/java/io/quarkus/elasticsearch/restclient/lowlevel/runtime/ElasticsearchConfig.java @@ -53,13 +53,13 @@ public interface ElasticsearchConfig { /** * The maximum number of connections to all the Elasticsearch servers. */ - @WithDefault("20") + @WithDefault("40") int maxConnections(); /** * The maximum number of connections per Elasticsearch server. */ - @WithDefault("10") + @WithDefault("20") int maxConnectionsPerRoute(); /** diff --git a/extensions/hibernate-envers/deployment/src/main/java/io/quarkus/hibernate/envers/deployment/HibernateEnversProcessor.java b/extensions/hibernate-envers/deployment/src/main/java/io/quarkus/hibernate/envers/deployment/HibernateEnversProcessor.java index 563904a20ef67..6bba52a0c2a0b 100644 --- a/extensions/hibernate-envers/deployment/src/main/java/io/quarkus/hibernate/envers/deployment/HibernateEnversProcessor.java +++ b/extensions/hibernate-envers/deployment/src/main/java/io/quarkus/hibernate/envers/deployment/HibernateEnversProcessor.java @@ -29,15 +29,21 @@ public final class HibernateEnversProcessor { List addJpaModelClasses() { return Arrays.asList( new AdditionalJpaModelBuildItem("org.hibernate.envers.DefaultRevisionEntity"), - new AdditionalJpaModelBuildItem("org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity")); + new AdditionalJpaModelBuildItem("org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity"), + new AdditionalJpaModelBuildItem("org.hibernate.envers.RevisionMapping"), + new AdditionalJpaModelBuildItem("org.hibernate.envers.TrackingModifiedEntitiesRevisionMapping")); } @BuildStep public void registerEnversReflections(BuildProducer reflectiveClass, HibernateEnversBuildTimeConfig buildTimeConfig) { + // This is necessary because these classes are added to the model conditionally at static init, + // so they don't get processed by HibernateOrmProcessor and in particular don't get reflection enabled. reflectiveClass.produce(ReflectiveClassBuildItem.builder( "org.hibernate.envers.DefaultRevisionEntity", - "org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity") + "org.hibernate.envers.DefaultTrackingModifiedEntitiesRevisionEntity", + "org.hibernate.envers.RevisionMapping", + "org.hibernate.envers.TrackingModifiedEntitiesRevisionMapping") .reason(getClass().getName()) .methods().build()); diff --git a/extensions/hibernate-orm-derby/deployment/pom.xml b/extensions/hibernate-orm-derby/deployment/pom.xml new file mode 100644 index 0000000000000..348387d604fc0 --- /dev/null +++ b/extensions/hibernate-orm-derby/deployment/pom.xml @@ -0,0 +1,60 @@ + + + + quarkus-hibernate-orm-derby-parent + io.quarkus + 999-SNAPSHOT + + 4.0.0 + + quarkus-hibernate-orm-derby-deployment + Quarkus - Hibernate ORM - Derby - Deployment + This extensions is added by Quarkus automatically when quarkus-hibernate-orm and quarkus-jdbc-derby are on the classpath + + + + io.quarkus + quarkus-core-deployment + + + + io.quarkus + quarkus-hibernate-orm-deployment-spi + + + io.quarkus + quarkus-datasource-common + + + + io.quarkus + quarkus-hibernate-orm-derby + + + + + + + maven-compiler-plugin + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + + + + + + + diff --git a/extensions/hibernate-orm-derby/deployment/src/main/java/HibernateOrmDerbyProcessor.java b/extensions/hibernate-orm-derby/deployment/src/main/java/HibernateOrmDerbyProcessor.java new file mode 100644 index 0000000000000..c2e9cccb5e0dc --- /dev/null +++ b/extensions/hibernate-orm-derby/deployment/src/main/java/HibernateOrmDerbyProcessor.java @@ -0,0 +1,22 @@ +import java.util.Set; + +import org.hibernate.community.dialect.CommunityDialectResolver; +import org.hibernate.engine.jdbc.dialect.spi.DialectResolver; + +import io.quarkus.datasource.common.runtime.DatabaseKind; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.builditem.nativeimage.ServiceProviderBuildItem; +import io.quarkus.hibernate.orm.deployment.spi.DatabaseKindDialectBuildItem; + +public final class HibernateOrmDerbyProcessor { + @BuildStep + public DatabaseKindDialectBuildItem registerHibernateOrmMetadataForDerbyDialect() { + return DatabaseKindDialectBuildItem.forCoreDialect(DatabaseKind.DERBY, "Apache Derby", + Set.of("org.hibernate.community.dialect.DerbyDialect")); + } + + @BuildStep + public ServiceProviderBuildItem registerCommunityDialectResolver() { + return new ServiceProviderBuildItem(DialectResolver.class.getName(), CommunityDialectResolver.class.getName()); + } +} diff --git a/extensions/hibernate-orm-derby/pom.xml b/extensions/hibernate-orm-derby/pom.xml new file mode 100644 index 0000000000000..a381ea0a21d8c --- /dev/null +++ b/extensions/hibernate-orm-derby/pom.xml @@ -0,0 +1,21 @@ + + + + + quarkus-extensions-parent + io.quarkus + 999-SNAPSHOT + ../pom.xml + + 4.0.0 + + quarkus-hibernate-orm-derby-parent + Quarkus - Hibernate ORM - Derby - Deployment + pom + + runtime + deployment + + diff --git a/extensions/hibernate-orm-derby/runtime/pom.xml b/extensions/hibernate-orm-derby/runtime/pom.xml new file mode 100644 index 0000000000000..9c6938794e485 --- /dev/null +++ b/extensions/hibernate-orm-derby/runtime/pom.xml @@ -0,0 +1,68 @@ + + + + quarkus-hibernate-orm-derby-parent + io.quarkus + 999-SNAPSHOT + + 4.0.0 + + quarkus-hibernate-orm-derby + Quarkus - Hibernate ORM - Derby - Deployment + This extensions is added by Quarkus automatically when quarkus-hibernate-orm and quarkus-jdbc-derby are on the classpath + + + + io.quarkus + quarkus-core + + + org.hibernate.orm + hibernate-community-dialects + + + + + + + io.quarkus + quarkus-extension-maven-plugin + + + compile + + extension-descriptor + + + ${project.groupId}:${project.artifactId}-deployment:${project.version} + + io.quarkus:quarkus-jdbc-derby + + + + + + + maven-compiler-plugin + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + + + + + + + diff --git a/extensions/hibernate-orm-derby/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions/hibernate-orm-derby/runtime/src/main/resources/META-INF/quarkus-extension.yaml new file mode 100644 index 0000000000000..0ae1a6c04092e --- /dev/null +++ b/extensions/hibernate-orm-derby/runtime/src/main/resources/META-INF/quarkus-extension.yaml @@ -0,0 +1,6 @@ +name: Quarkus Hibernate ORM Derby +artifact: ${project.groupId}:${project.artifactId}:${project.version} +description: Conditional extension added when Hibernate ORM and the Derby JDBC driver are present +metadata: + unlisted: true + diff --git a/extensions/hibernate-orm/deployment-spi/src/main/java/io/quarkus/hibernate/orm/deployment/spi/DatabaseKindDialectBuildItem.java b/extensions/hibernate-orm/deployment-spi/src/main/java/io/quarkus/hibernate/orm/deployment/spi/DatabaseKindDialectBuildItem.java index 0087e4334b4f7..7e924ed3d8789 100644 --- a/extensions/hibernate-orm/deployment-spi/src/main/java/io/quarkus/hibernate/orm/deployment/spi/DatabaseKindDialectBuildItem.java +++ b/extensions/hibernate-orm/deployment-spi/src/main/java/io/quarkus/hibernate/orm/deployment/spi/DatabaseKindDialectBuildItem.java @@ -19,6 +19,8 @@ public final class DatabaseKindDialectBuildItem extends MultiBuildItem { * @param dbKind The DB Kind set through {@code quarkus.datasource.db-kind} * @param databaseProductName The corresponding database-product-name to set in Hibernate ORM. * See {@code org.hibernate.dialect.Database} for information on how this name is resolved to a dialect. + * Also works with {@code org.hibernate.community.dialect.CommunityDatabase} if + * {@code hibernate-community-dialects} is in the classpath. * @param dialects The corresponding dialects in Hibernate ORM, * to detect the dbKind when using database multi-tenancy. */ @@ -32,6 +34,8 @@ public static DatabaseKindDialectBuildItem forCoreDialect(String dbKind, String * @param dbKind The DB Kind set through {@code quarkus.datasource.db-kind} * @param databaseProductName The corresponding database-product-name to set in Hibernate ORM. * See {@code org.hibernate.dialect.Database} for information on how this name is resolved to a dialect. + * Also works with {@code org.hibernate.community.dialect.CommunityDatabase} if + * {@code hibernate-community-dialects} is in the classpath. * @param dialects The corresponding dialects in Hibernate ORM, * to detect the dbKind when using database multi-tenancy. * @param defaultDatabaseProductVersion The default database-product-version to set in Hibernate ORM. diff --git a/extensions/hibernate-orm/deployment/pom.xml b/extensions/hibernate-orm/deployment/pom.xml index e17abfe0a5389..f54d4fbcdf3bd 100644 --- a/extensions/hibernate-orm/deployment/pom.xml +++ b/extensions/hibernate-orm/deployment/pom.xml @@ -53,6 +53,12 @@ io.quarkus quarkus-vertx-http-dev-ui-spi + + io.quarkus + quarkus-hibernate-orm-derby-deployment + true + + io.quarkus quarkus-junit5-internal 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 6ac2d186c0202..110e37540eab2 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 @@ -44,7 +44,6 @@ private static DotName createConstant(String fqcn) { public static final DotName EMBEDDED = createConstant("jakarta.persistence.Embedded"); public static final DotName EMBEDDED_ID = createConstant("jakarta.persistence.EmbeddedId"); public static final DotName ELEMENT_COLLECTION = createConstant("jakarta.persistence.ElementCollection"); - public static final DotName PROXY = createConstant("org.hibernate.annotations.Proxy"); public static final DotName HIBERNATE_PROXY = createConstant("org.hibernate.proxy.HibernateProxy"); public static final DotName TYPE = createConstant("org.hibernate.annotations.Type"); public static final DotName INJECT_SERVICE = createConstant("org.hibernate.service.spi.InjectService"); @@ -57,7 +56,8 @@ private static DotName createConstant(String fqcn) { public static final DotName HIBERNATE_CRITERIA_BUILDER = createConstant( "org.hibernate.query.criteria.HibernateCriteriaBuilder"); public static final DotName METAMODEL = createConstant("jakarta.persistence.metamodel.Metamodel"); - public static final DotName SCHEMA_MANAGER = createConstant("org.hibernate.relational.SchemaManager"); + public static final DotName SCHEMA_MANAGER = createConstant("jakarta.persistence.SchemaManager"); + public static final DotName HIBERNATE_SCHEMA_MANAGER = createConstant("org.hibernate.relational.SchemaManager"); public static final DotName CACHE = createConstant("jakarta.persistence.Cache"); public static final DotName HIBERNATE_CACHE = createConstant("org.hibernate.Cache"); public static final DotName PERSISTENCE_UNIT_UTIL = createConstant("jakarta.persistence.PersistenceUnitUtil"); @@ -69,6 +69,7 @@ private static DotName createConstant(String fqcn) { public static final DotName XML_FORMAT = createConstant("io.quarkus.hibernate.orm.XmlFormat"); public static final List GENERATORS = List.of( + createConstant("org.hibernate.generator.Assigned"), createConstant("org.hibernate.generator.internal.CurrentTimestampGeneration"), createConstant("org.hibernate.generator.internal.GeneratedAlwaysGeneration"), createConstant("org.hibernate.generator.internal.GeneratedGeneration"), @@ -81,17 +82,39 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.id.GUIDGenerator"), createConstant("org.hibernate.id.IdentityGenerator"), createConstant("org.hibernate.id.IncrementGenerator"), + createConstant("org.hibernate.id.NativeGenerator"), createConstant("org.hibernate.id.SelectGenerator"), createConstant("org.hibernate.id.UUIDGenerator"), createConstant("org.hibernate.id.UUIDHexGenerator"), createConstant("org.hibernate.id.enhanced.SequenceStyleGenerator"), createConstant("org.hibernate.id.enhanced.TableGenerator"), createConstant("org.hibernate.id.uuid.UuidGenerator"), - createConstant("org.hibernate.tuple.CreationTimestampGeneration"), - createConstant("org.hibernate.tuple.UpdateTimestampGeneration"), - createConstant("org.hibernate.tuple.VmValueGeneration")); + createConstant("org.hibernate.tuple.entity.CompositeGeneratorBuilder$CompositeBeforeExecutionGenerator"), + createConstant("org.hibernate.tuple.entity.CompositeGeneratorBuilder$CompositeOnExecutionGenerator"), + createConstant("org.hibernate.tuple.entity.CompositeGeneratorBuilder$DummyGenerator")); + + public static final List OPTIMIZERS = List.of( + createConstant("org.hibernate.id.enhanced.HiLoOptimizer"), + createConstant("org.hibernate.id.enhanced.LegacyHiLoAlgorithmOptimizer"), + createConstant("org.hibernate.id.enhanced.NoopOptimizer"), + createConstant("org.hibernate.id.enhanced.PooledLoOptimizer"), + createConstant("org.hibernate.id.enhanced.PooledLoThreadLocalOptimizer"), + createConstant("org.hibernate.id.enhanced.PooledOptimizer")); + + // Only including naming strategies that will for sure be in every native binary and be instantiated at runtime. + // PhysicalNamingStrategy and ImplicitNamingStrategy implementations, + // in particular, are instantiated at static init. + // ImplicitDatabaseObjectNamingStrategy cannot be overridden through supported settings in Quarkus ATM, + // so we're left with only the default (and the legacy one for ORM 5.6 compatibility). + public static final List NAMING_STRATEGIES = List.of( + createConstant("org.hibernate.id.enhanced.LegacyNamingStrategy"), + createConstant("org.hibernate.id.enhanced.StandardNamingStrategy")); public static final List PACKAGE_ANNOTATIONS = List.of( + createConstant("jakarta.persistence.SequenceGenerator"), + createConstant("jakarta.persistence.SequenceGenerators"), + createConstant("jakarta.persistence.TableGenerator"), + createConstant("jakarta.persistence.TableGenerators"), createConstant("org.hibernate.annotations.CollectionTypeRegistration"), createConstant("org.hibernate.annotations.CompositeTypeRegistration"), createConstant("org.hibernate.annotations.CompositeTypeRegistrations"), @@ -114,10 +137,13 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.JdbcTypeRegistration"), createConstant("org.hibernate.annotations.JdbcTypeRegistrations"), createConstant("org.hibernate.annotations.ListIndexBase"), + createConstant("org.hibernate.annotations.NamedEntityGraph"), + createConstant("org.hibernate.annotations.NamedEntityGraphs"), createConstant("org.hibernate.annotations.NamedNativeQueries"), createConstant("org.hibernate.annotations.NamedNativeQuery"), createConstant("org.hibernate.annotations.NamedQueries"), createConstant("org.hibernate.annotations.NamedQuery"), + createConstant("org.hibernate.annotations.NativeGenerator"), createConstant("org.hibernate.annotations.SoftDelete"), createConstant("org.hibernate.annotations.TypeRegistration"), createConstant("org.hibernate.annotations.TypeRegistrations")); @@ -130,6 +156,7 @@ private static DotName createConstant(String fqcn) { createConstant("jakarta.persistence.AttributeOverrides"), createConstant("jakarta.persistence.Basic"), createConstant("jakarta.persistence.Cacheable"), + createConstant("jakarta.persistence.CheckConstraint"), createConstant("jakarta.persistence.CollectionTable"), createConstant("jakarta.persistence.Column"), createConstant("jakarta.persistence.ColumnResult"), @@ -143,6 +170,7 @@ private static DotName createConstant(String fqcn) { createConstant("jakarta.persistence.Embeddable"), createConstant("jakarta.persistence.Embedded"), createConstant("jakarta.persistence.EmbeddedId"), + createConstant("jakarta.persistence.EnumeratedValue"), createConstant("jakarta.persistence.Entity"), createConstant("jakarta.persistence.EntityListeners"), createConstant("jakarta.persistence.EntityResult"), @@ -220,6 +248,7 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.AnyDiscriminator"), createConstant("org.hibernate.annotations.AnyDiscriminatorValue"), createConstant("org.hibernate.annotations.AnyDiscriminatorValues"), + createConstant("org.hibernate.annotations.AnyDiscriminatorImplicitValues"), createConstant("org.hibernate.annotations.AnyKeyJavaClass"), createConstant("org.hibernate.annotations.AnyKeyJavaType"), createConstant("org.hibernate.annotations.AnyKeyJdbcType"), @@ -235,6 +264,7 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.Checks"), createConstant("org.hibernate.annotations.Collate"), createConstant("org.hibernate.annotations.CollectionId"), + createConstant("org.hibernate.annotations.CollectionIdJavaClass"), createConstant("org.hibernate.annotations.CollectionIdJavaType"), createConstant("org.hibernate.annotations.CollectionIdJdbcType"), createConstant("org.hibernate.annotations.CollectionIdJdbcTypeCode"), @@ -273,8 +303,6 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.DialectOverride$GeneratedColumns"), createConstant("org.hibernate.annotations.DialectOverride$JoinFormula"), createConstant("org.hibernate.annotations.DialectOverride$JoinFormulas"), - createConstant("org.hibernate.annotations.DialectOverride$OrderBy"), - createConstant("org.hibernate.annotations.DialectOverride$OrderBys"), createConstant("org.hibernate.annotations.DialectOverride$OverridesAnnotation"), createConstant("org.hibernate.annotations.DialectOverride$SQLDelete"), createConstant("org.hibernate.annotations.DialectOverride$SQLDeleteAll"), @@ -291,13 +319,12 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.DialectOverride$SQLUpdate"), createConstant("org.hibernate.annotations.DialectOverride$SQLUpdates"), createConstant("org.hibernate.annotations.DialectOverride$Version"), - createConstant("org.hibernate.annotations.DialectOverride$Where"), - createConstant("org.hibernate.annotations.DialectOverride$Wheres"), createConstant("org.hibernate.annotations.DiscriminatorFormula"), createConstant("org.hibernate.annotations.DiscriminatorOptions"), createConstant("org.hibernate.annotations.DynamicInsert"), createConstant("org.hibernate.annotations.DynamicUpdate"), createConstant("org.hibernate.annotations.EmbeddableInstantiator"), + createConstant("org.hibernate.annotations.EmbeddedColumnNaming"), createConstant("org.hibernate.annotations.EmbeddableInstantiatorRegistration"), createConstant("org.hibernate.annotations.EmbeddableInstantiatorRegistrations"), createConstant("org.hibernate.annotations.Fetch"), @@ -312,20 +339,16 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.FilterJoinTable"), createConstant("org.hibernate.annotations.FilterJoinTables"), createConstant("org.hibernate.annotations.Filters"), - createConstant("org.hibernate.annotations.ForeignKey"), createConstant("org.hibernate.annotations.Formula"), createConstant("org.hibernate.annotations.FractionalSeconds"), createConstant("org.hibernate.annotations.Generated"), createConstant("org.hibernate.annotations.GeneratedColumn"), - createConstant("org.hibernate.annotations.GeneratorType"), createConstant("org.hibernate.annotations.GenericGenerator"), createConstant("org.hibernate.annotations.GenericGenerators"), createConstant("org.hibernate.annotations.HQLSelect"), createConstant("org.hibernate.annotations.IdGeneratorType"), createConstant("org.hibernate.annotations.Immutable"), createConstant("org.hibernate.annotations.Imported"), - createConstant("org.hibernate.annotations.Index"), - createConstant("org.hibernate.annotations.IndexColumn"), createConstant("org.hibernate.annotations.Instantiator"), createConstant("org.hibernate.annotations.JavaType"), createConstant("org.hibernate.annotations.JavaTypeRegistration"), @@ -337,14 +360,11 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.JoinColumnOrFormula"), createConstant("org.hibernate.annotations.JoinColumnsOrFormulas"), createConstant("org.hibernate.annotations.JoinFormula"), - createConstant("org.hibernate.annotations.LazyCollection"), createConstant("org.hibernate.annotations.LazyGroup"), - createConstant("org.hibernate.annotations.LazyToOne"), createConstant("org.hibernate.annotations.ListIndexBase"), createConstant("org.hibernate.annotations.ListIndexJavaType"), createConstant("org.hibernate.annotations.ListIndexJdbcType"), createConstant("org.hibernate.annotations.ListIndexJdbcTypeCode"), - createConstant("org.hibernate.annotations.Loader"), createConstant("org.hibernate.annotations.ManyToAny"), createConstant("org.hibernate.annotations.MapKeyJavaType"), createConstant("org.hibernate.annotations.MapKeyJdbcType"), @@ -352,25 +372,25 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.MapKeyMutability"), createConstant("org.hibernate.annotations.MapKeyType"), createConstant("org.hibernate.annotations.Mutability"), + createConstant("org.hibernate.annotations.NamedEntityGraph"), + createConstant("org.hibernate.annotations.NamedEntityGraphs"), createConstant("org.hibernate.annotations.NamedNativeQueries"), createConstant("org.hibernate.annotations.NamedNativeQuery"), createConstant("org.hibernate.annotations.NamedQueries"), createConstant("org.hibernate.annotations.NamedQuery"), createConstant("org.hibernate.annotations.Nationalized"), + createConstant("org.hibernate.annotations.NativeGenerator"), createConstant("org.hibernate.annotations.NaturalId"), createConstant("org.hibernate.annotations.NaturalIdCache"), createConstant("org.hibernate.annotations.NotFound"), createConstant("org.hibernate.annotations.OnDelete"), createConstant("org.hibernate.annotations.OptimisticLock"), createConstant("org.hibernate.annotations.OptimisticLocking"), - createConstant("org.hibernate.annotations.OrderBy"), createConstant("org.hibernate.annotations.ParamDef"), createConstant("org.hibernate.annotations.Parameter"), createConstant("org.hibernate.annotations.Parent"), createConstant("org.hibernate.annotations.PartitionKey"), - createConstant("org.hibernate.annotations.Persister"), - createConstant("org.hibernate.annotations.Polymorphism"), - createConstant("org.hibernate.annotations.Proxy"), + createConstant("org.hibernate.annotations.PropertyRef"), createConstant("org.hibernate.annotations.QueryCacheLayout"), createConstant("org.hibernate.annotations.RowId"), createConstant("org.hibernate.annotations.SQLDelete"), @@ -386,7 +406,6 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.SQLUpdates"), createConstant("org.hibernate.annotations.SecondaryRow"), createConstant("org.hibernate.annotations.SecondaryRows"), - createConstant("org.hibernate.annotations.SelectBeforeUpdate"), createConstant("org.hibernate.annotations.SoftDelete"), createConstant("org.hibernate.annotations.SortComparator"), createConstant("org.hibernate.annotations.SortNatural"), @@ -395,9 +414,7 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.Struct"), createConstant("org.hibernate.annotations.Subselect"), createConstant("org.hibernate.annotations.Synchronize"), - createConstant("org.hibernate.annotations.Table"), - createConstant("org.hibernate.annotations.Tables"), - createConstant("org.hibernate.annotations.Target"), + createConstant("org.hibernate.annotations.TargetEmbeddable"), createConstant("org.hibernate.annotations.TenantId"), createConstant("org.hibernate.annotations.TimeZoneColumn"), createConstant("org.hibernate.annotations.TimeZoneStorage"), @@ -408,9 +425,7 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.UpdateTimestamp"), createConstant("org.hibernate.annotations.UuidGenerator"), createConstant("org.hibernate.annotations.ValueGenerationType"), - createConstant("org.hibernate.annotations.View"), - createConstant("org.hibernate.annotations.Where"), - createConstant("org.hibernate.annotations.WhereJoinTable")); + createConstant("org.hibernate.annotations.View")); public static final List ANNOTATED_WITH_INJECT_SERVICE = List.of( createConstant("org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl")); @@ -463,9 +478,6 @@ private static DotName createConstant(String fqcn) { createConstant("java.util.UUID"), createConstant("java.lang.Void")); - public static final List STANDARD_STACK_ELEMENT_TYPES = List.of( - createConstant("org.hibernate.query.sqm.tree.select.SqmQueryPart")); - public static final DotName HIBERNATE_ORM_PROCESSOR = createConstant( "io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor"); 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 d964cdae8694c..ffb3b15ad7452 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,9 @@ package io.quarkus.hibernate.orm.deployment; import static io.quarkus.hibernate.orm.deployment.ClassNames.GENERATORS; +import static io.quarkus.hibernate.orm.deployment.ClassNames.OPTIMIZERS; + +import java.util.stream.Stream; import org.jboss.jandex.DotName; @@ -21,10 +24,12 @@ NativeImageFeatureBuildItem staticNativeImageFeature() { return new NativeImageFeatureBuildItem("org.hibernate.graalvm.internal.GraalVMStaticFeature"); } - // Workaround for https://hibernate.atlassian.net/browse/HHH-16439 + // TODO try to limit registration to those that are actually needed, based on configuration + mapping. + // https://github.com/quarkusio/quarkus/pull/32433#issuecomment-1497615958 @BuildStep - ReflectiveClassBuildItem registerGeneratorClassesForReflections() { - return ReflectiveClassBuildItem.builder(GENERATORS.stream().map(DotName::toString).toArray(String[]::new)) + ReflectiveClassBuildItem registerGeneratorAndOptimizerClassesForReflections() { + return ReflectiveClassBuildItem + .builder(Stream.concat(GENERATORS.stream(), OPTIMIZERS.stream()).map(DotName::toString).toArray(String[]::new)) .reason(ClassNames.GRAAL_VM_FEATURES.toString()) .build(); } @@ -39,13 +44,12 @@ ReflectiveClassBuildItem registerJdbcArrayTypesForReflection() { .build(); } - // Workaround for https://hibernate.atlassian.net/browse/HHH-18875 - // See https://hibernate.zulipchat.com/#narrow/channel/132094-hibernate-orm-dev/topic/StandardStack.20and.20reflection + // Workaround for https://hibernate.atlassian.net/browse/HHH-18975 @BuildStep - ReflectiveClassBuildItem registerStandardStackElementTypesForReflection() { + ReflectiveClassBuildItem registerNamingStrategiesForReflections() { return ReflectiveClassBuildItem - .builder(ClassNames.STANDARD_STACK_ELEMENT_TYPES.stream().map(d -> d.toString() + "[]").toArray(String[]::new)) - .reason("Workaround for https://hibernate.atlassian.net/browse/HHH-18875") + .builder(ClassNames.NAMING_STRATEGIES.stream().map(DotName::toString).toArray(String[]::new)) + .reason(ClassNames.GRAAL_VM_FEATURES.toString()) .build(); } diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmCdiProcessor.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmCdiProcessor.java index 282c05f8a4e01..9d6df3a62133f 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmCdiProcessor.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmCdiProcessor.java @@ -88,7 +88,8 @@ public class HibernateOrmCdiProcessor { private static final List CRITERIA_BUILDER_EXPOSED_TYPES = List.of(ClassNames.CRITERIA_BUILDER, ClassNames.HIBERNATE_CRITERIA_BUILDER); private static final List METAMODEL_EXPOSED_TYPES = List.of(ClassNames.METAMODEL); - private static final List SCHEMA_MANAGER_EXPOSED_TYPES = List.of(ClassNames.SCHEMA_MANAGER); + private static final List SCHEMA_MANAGER_EXPOSED_TYPES = List.of(ClassNames.SCHEMA_MANAGER, + ClassNames.HIBERNATE_SCHEMA_MANAGER); private static final List CACHE_EXPOSED_TYPES = List.of(ClassNames.CACHE, ClassNames.HIBERNATE_CACHE); private static final List PERSISTENCE_UNIT_UTIL_EXPOSED_TYPES = List.of(ClassNames.PERSISTENCE_UNIT_UTIL); diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java index 85c6341a4e2b4..fa6e9757787d6 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java @@ -36,7 +36,7 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Default; -import jakarta.persistence.spi.PersistenceUnitTransactionType; +import jakarta.persistence.PersistenceUnitTransactionType; import jakarta.xml.bind.JAXBElement; import org.hibernate.boot.archive.scan.spi.ClassDescriptor; @@ -45,9 +45,9 @@ import org.hibernate.cfg.AvailableSettings; import org.hibernate.integrator.spi.Integrator; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; +import org.hibernate.jpa.boot.spi.PersistenceXmlParser; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationTarget.Kind; -import org.jboss.jandex.AnnotationValue; import org.jboss.jandex.ClassInfo; import org.jboss.jandex.CompositeIndex; import org.jboss.jandex.DotName; @@ -128,6 +128,7 @@ import io.quarkus.hibernate.orm.runtime.proxies.PreGeneratedProxies; import io.quarkus.hibernate.orm.runtime.recording.RecordedConfig; import io.quarkus.hibernate.orm.runtime.schema.SchemaManagementIntegrator; +import io.quarkus.hibernate.orm.runtime.service.FlatClassLoaderService; import io.quarkus.hibernate.orm.runtime.tenant.DataSourceTenantConnectionResolver; import io.quarkus.hibernate.orm.runtime.tenant.TenantConnectionResolver; import io.quarkus.panache.hibernate.common.deployment.HibernateEnhancersRegisteredBuildItem; @@ -171,8 +172,6 @@ void registerHibernateOrmMetadataForCoreDialects( BuildProducer producer) { producer.produce(DatabaseKindDialectBuildItem.forCoreDialect(DatabaseKind.DB2, "DB2", Set.of("org.hibernate.dialect.DB2Dialect"))); - producer.produce(DatabaseKindDialectBuildItem.forCoreDialect(DatabaseKind.DERBY, "Apache Derby", - Set.of("org.hibernate.dialect.DerbyDialect"))); producer.produce(DatabaseKindDialectBuildItem.forCoreDialect(DatabaseKind.H2, "H2", Set.of("org.hibernate.dialect.H2Dialect"), // Using our own default version is extra important for H2 @@ -267,8 +266,12 @@ List hotDeploymentWatchedFiles(HibernateOrmCo public void parsePersistenceXmlDescriptors(HibernateOrmConfig config, BuildProducer persistenceXmlDescriptorBuildItemBuildProducer) { if (!shouldIgnorePersistenceXmlResources(config)) { - var explicitDescriptors = QuarkusPersistenceXmlParser.locatePersistenceUnits(); - for (var desc : explicitDescriptors) { + var parser = PersistenceXmlParser.create(Map.of(), null, FlatClassLoaderService.INSTANCE); + var urls = parser.getClassLoaderService().locateResources("META-INF/persistence.xml"); + if (urls.isEmpty()) { + return; + } + for (var desc : parser.parse(urls).values()) { persistenceXmlDescriptorBuildItemBuildProducer.produce(new PersistenceXmlDescriptorBuildItem(desc)); } } @@ -1345,14 +1348,6 @@ private PreGeneratedProxies generatedProxies(Set managedClassAndPackageN } //create a map of entity to proxy type PreGeneratedProxies preGeneratedProxies = new PreGeneratedProxies(); - Map proxyAnnotations = new HashMap<>(); - for (AnnotationInstance i : combinedIndex.getAnnotations(ClassNames.PROXY)) { - AnnotationValue proxyClass = i.value("proxyClass"); - if (proxyClass == null) { - continue; - } - proxyAnnotations.put(i.target().asClass().name().toString(), proxyClass.asClass().name().toString()); - } TypePool transformedClassesTypePool = createTransformedClassesTypePool(transformedClassesBuildItem, managedClassAndPackageNames); try (ProxyBuildingHelper proxyHelper = new ProxyBuildingHelper(transformedClassesTypePool)) { @@ -1364,28 +1359,11 @@ private PreGeneratedProxies generatedProxies(Set managedClassAndPackageN } else { Set proxyInterfaceNames = new TreeSet<>(); proxyInterfaceNames.add(ClassNames.HIBERNATE_PROXY.toString()); //always added - String proxy = proxyAnnotations.get(managedClassOrPackageName); - if (proxy == null) { - if (!proxyHelper.isProxiable(managedClassOrPackageName)) { - //if there is no @Proxy we need to make sure the actual class is proxiable - continue; - } - } else { - proxyInterfaceNames.add(proxy); + if (!proxyHelper.isProxiable(managedClassOrPackageName)) { + // we need to make sure the actual class is proxiable + continue; } final String mappedClass = managedClassOrPackageName; - for (ClassInfo subclass : combinedIndex - .getAllKnownSubclasses(DotName.createSimple(managedClassOrPackageName))) { - String subclassName = subclass.name().toString(); - if (!managedClassAndPackageNames.contains(subclassName)) { - //not an entity - continue; - } - proxy = proxyAnnotations.get(subclassName); - if (proxy != null) { - proxyInterfaceNames.add(proxy); - } - } DynamicType.Unloaded unloaded = proxyHelper.buildUnloadedProxy(mappedClass, proxyInterfaceNames); result = new CachedProxy(unloaded, proxyInterfaceNames); proxyCache.cache.put(managedClassOrPackageName, result); diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/JpaJandexScavenger.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/JpaJandexScavenger.java index 76268a0582f84..482a087734030 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/JpaJandexScavenger.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/JpaJandexScavenger.java @@ -19,17 +19,11 @@ import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmJoinedSubclassEntityType; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmRootEntityType; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmUnionSubclassEntityType; -import org.hibernate.boot.jaxb.mapping.EntityOrMappedSuperclass; -import org.hibernate.boot.jaxb.mapping.JaxbConverter; -import org.hibernate.boot.jaxb.mapping.JaxbEmbeddable; -import org.hibernate.boot.jaxb.mapping.JaxbEntity; -import org.hibernate.boot.jaxb.mapping.JaxbEntityListener; -import org.hibernate.boot.jaxb.mapping.JaxbEntityListeners; -import org.hibernate.boot.jaxb.mapping.JaxbEntityMappings; -import org.hibernate.boot.jaxb.mapping.JaxbMappedSuperclass; -import org.hibernate.boot.jaxb.mapping.JaxbPersistenceUnitDefaults; -import org.hibernate.boot.jaxb.mapping.JaxbPersistenceUnitMetadata; -import org.hibernate.boot.jaxb.mapping.ManagedType; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntity; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityListenerContainerImpl; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityOrMappedSuperclass; +import org.hibernate.boot.jaxb.mapping.spi.JaxbManagedType; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationTarget; import org.jboss.jandex.ClassInfo; @@ -190,32 +184,33 @@ private void enlistExplicitMappings(Collector collector, } } - private void enlistOrmXmlMapping(Collector collector, JaxbEntityMappings mapping) { + private void enlistOrmXmlMapping(Collector collector, JaxbEntityMappingsImpl mapping) { String packageName = mapping.getPackage(); String packagePrefix = packageName == null ? "" : packageName + "."; - JaxbPersistenceUnitMetadata metadata = mapping.getPersistenceUnitMetadata(); - JaxbPersistenceUnitDefaults defaults = metadata == null ? null : metadata.getPersistenceUnitDefaults(); + var metadata = mapping.getPersistenceUnitMetadata(); + var defaults = metadata == null ? null : metadata.getPersistenceUnitDefaults(); if (defaults != null) { - enlistOrmXmlMappingListeners(collector, packagePrefix, defaults.getEntityListeners()); + enlistOrmXmlMappingListeners(collector, packagePrefix, defaults.getEntityListenerContainer()); } - for (JaxbEntity entity : mapping.getEntities()) { + for (var entity : mapping.getEntities()) { enlistOrmXmlMappingManagedClass(collector, packagePrefix, entity, "entity"); } - for (JaxbMappedSuperclass mappedSuperclass : mapping.getMappedSuperclasses()) { + for (var mappedSuperclass : mapping.getMappedSuperclasses()) { enlistOrmXmlMappingManagedClass(collector, packagePrefix, mappedSuperclass, "mapped-superclass"); } - for (JaxbEmbeddable embeddable : mapping.getEmbeddables()) { + for (var embeddable : mapping.getEmbeddables()) { String name = safeGetClassName(packagePrefix, embeddable, "embeddable"); enlistExplicitClass(collector, name); } - for (JaxbConverter converter : mapping.getConverters()) { + for (var converter : mapping.getConverters()) { collector.potentialCdiBeanTypes.add(DotName.createSimple(qualifyIfNecessary(packagePrefix, converter.getClazz()))); } } - private void enlistOrmXmlMappingManagedClass(Collector collector, String packagePrefix, EntityOrMappedSuperclass managed, + private void enlistOrmXmlMappingManagedClass(Collector collector, String packagePrefix, + JaxbEntityOrMappedSuperclass managed, String nodeName) { String name = safeGetClassName(packagePrefix, managed, nodeName); enlistExplicitClass(collector, name); @@ -225,19 +220,20 @@ private void enlistOrmXmlMappingManagedClass(Collector collector, String package collector.entityTypes.add(name); } - enlistOrmXmlMappingListeners(collector, packagePrefix, managed.getEntityListeners()); + enlistOrmXmlMappingListeners(collector, packagePrefix, managed.getEntityListenerContainer()); } - private void enlistOrmXmlMappingListeners(Collector collector, String packagePrefix, JaxbEntityListeners entityListeners) { + private void enlistOrmXmlMappingListeners(Collector collector, String packagePrefix, + JaxbEntityListenerContainerImpl entityListeners) { if (entityListeners == null) { return; } - for (JaxbEntityListener listener : entityListeners.getEntityListener()) { + for (var listener : entityListeners.getEntityListeners()) { collector.potentialCdiBeanTypes.add(DotName.createSimple(qualifyIfNecessary(packagePrefix, listener.getClazz()))); } } - private static String safeGetClassName(String packagePrefix, ManagedType managedType, String nodeName) { + private static String safeGetClassName(String packagePrefix, JaxbManagedType managedType, String nodeName) { String name = managedType.getClazz(); if (name == null) { throw new IllegalArgumentException("Missing attribute '" + nodeName + ".class'"); diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java deleted file mode 100644 index 508178dd4aab9..0000000000000 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.quarkus.hibernate.orm.deployment; - -import java.net.URL; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import jakarta.persistence.spi.PersistenceUnitTransactionType; - -import org.hibernate.jpa.boot.internal.PersistenceXmlParser; -import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; - -import io.quarkus.hibernate.orm.runtime.service.FlatClassLoaderService; - -/** - * Similar to Hibernate ORM's PersistenceXmlParser to adapt it to - * specific needs in Quarkus. - */ -final class QuarkusPersistenceXmlParser extends PersistenceXmlParser { - - /** - * Similar to {@link PersistenceXmlParser#locatePersistenceUnits(Map)} - * except it doesn't need a properties map, and avoids complaining if no resources are found. - * - * @return the list of ParsedPersistenceXmlDescriptor(s), after discovery and parsing. - */ - public static List locatePersistenceUnits() { - final QuarkusPersistenceXmlParser parser = new QuarkusPersistenceXmlParser(); - parser.doResolve(); - return parser.getResolvedPersistenceUnits(); - } - - private QuarkusPersistenceXmlParser() { - //N.B. RESOURCE_LOCAL is matching the default in Hibernate ORM; we use the same here as persistence.xml is treated as "legacy" - // yet this is not the default that Quarkus will use when booting via `application.properties`. - super(FlatClassLoaderService.INSTANCE, PersistenceUnitTransactionType.RESOURCE_LOCAL); - } - - private void doResolve() { - final List xmlUrls = FlatClassLoaderService.INSTANCE.locateResources("META-INF/persistence.xml"); - for (URL xmlUrl : xmlUrls) { - parsePersistenceXml(xmlUrl, Collections.emptyMap()); - } - } - -} diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/util/HibernateProcessorUtil.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/util/HibernateProcessorUtil.java index ea4b481e290d1..b6b7050d2cc86 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/util/HibernateProcessorUtil.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/util/HibernateProcessorUtil.java @@ -22,7 +22,6 @@ import org.hibernate.id.SequenceMismatchStrategy; import org.hibernate.jpa.boot.spi.JpaSettings; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; -import org.hibernate.loader.BatchFetchStyle; import org.jboss.logging.Logger; import io.quarkus.datasource.common.runtime.DatabaseKind; @@ -174,7 +173,6 @@ public static void configureProperties(QuarkusPersistenceUnitDescriptor desc, Hi int batchSize = firstPresent(config.fetch().batchSize(), config.batchFetchSize()).orElse(defaultBatchSize(reactive)); if (batchSize > 0) { desc.getProperties().setProperty(AvailableSettings.DEFAULT_BATCH_FETCH_SIZE, Integer.toString(batchSize)); - desc.getProperties().setProperty(AvailableSettings.BATCH_FETCH_STYLE, BatchFetchStyle.PADDED.toString()); } // Fetch diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/xml/QuarkusMappingFileParser.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/xml/QuarkusMappingFileParser.java index 069bee4cd90a2..3c51d87421789 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/xml/QuarkusMappingFileParser.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/xml/QuarkusMappingFileParser.java @@ -9,6 +9,7 @@ import org.hibernate.boot.archive.internal.ArchiveHelper; import org.hibernate.boot.jaxb.spi.Binding; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; @@ -62,7 +63,7 @@ public Optional parse(String persistenceUnitName, URL pers } try (InputStream stream = url.openStream()) { - Binding binding = (Binding) binderAccess.bind(stream); + Binding binding = binderAccess.bind(stream); return Optional.of(RecordableXmlMapping.create(binding)); } catch (RuntimeException | IOException e) { throw new IllegalStateException( diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/SchemaUtil.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/SchemaUtil.java index e2f936ecdf31c..12d9562409b6f 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/SchemaUtil.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/SchemaUtil.java @@ -11,7 +11,6 @@ import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.mapping.SelectableConsumer; import org.hibernate.metamodel.mapping.SelectableMapping; -import org.hibernate.persister.entity.AbstractEntityPersister; import org.hibernate.persister.entity.EntityPersister; public final class SchemaUtil { @@ -21,9 +20,9 @@ private SchemaUtil() { public static Set getColumnNames(EntityManagerFactory entityManagerFactory, Class entityType) { Set result = new HashSet<>(); - AbstractEntityPersister persister = (AbstractEntityPersister) entityManagerFactory - .unwrap(SessionFactoryImplementor.class) - .getMetamodel().entityPersister(entityType); + var persister = entityManagerFactory.unwrap(SessionFactoryImplementor.class) + .getMappingMetamodel() + .getEntityDescriptor(entityType); if (persister == null) { return result; } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/databaseormcompatibility/DatabaseOrmCompatibilityVersionTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/databaseormcompatibility/DatabaseOrmCompatibilityVersionTest.java index 021f341bdd22a..882e3e04175b0 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/databaseormcompatibility/DatabaseOrmCompatibilityVersionTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/databaseormcompatibility/DatabaseOrmCompatibilityVersionTest.java @@ -74,7 +74,8 @@ public class DatabaseOrmCompatibilityVersionTest { @Test public void testPropertiesPropagatedToStaticInit() { - assertThat(SettingsSpyingIdentifierGenerator.collectedSettings).hasSize(1); + // Two sets of settings: 0 is static init, 1 is runtime init. + assertThat(SettingsSpyingIdentifierGenerator.collectedSettings).hasSize(2); Map settings = SettingsSpyingIdentifierGenerator.collectedSettings.get(0); assertThat(settings).containsAllEntriesOf(Map.of( AvailableSettings.TIMEZONE_DEFAULT_STORAGE, "NORMALIZE", diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/unsupportedproperties/UnsupportedPropertiesTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/unsupportedproperties/UnsupportedPropertiesTest.java index d97036d736a0b..c1b0ceb5c05a0 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/unsupportedproperties/UnsupportedPropertiesTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/config/unsupportedproperties/UnsupportedPropertiesTest.java @@ -102,7 +102,8 @@ public class UnsupportedPropertiesTest { @Test public void testPropertiesPropagatedToStaticInit() { - assertThat(SettingsSpyingIdentifierGenerator.collectedSettings).hasSize(1); + // Two sets of settings: 0 is static init, 1 is runtime init. + assertThat(SettingsSpyingIdentifierGenerator.collectedSettings).hasSize(2); Map settings = SettingsSpyingIdentifierGenerator.collectedSettings.get(0); assertThat(settings) .containsEntry("hibernate.some.unknown.key.static-and-runtime", "some-value-1") diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/deployment/ClassNamesTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/deployment/ClassNamesTest.java index 66ca64943ca52..4362fdf166d16 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/deployment/ClassNamesTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/deployment/ClassNamesTest.java @@ -74,6 +74,15 @@ public void testNoMissingGeneratorClass() { .containsExactlyInAnyOrderElementsOf(generatorImplementors); } + @Test + public void testNoMissingOptimizerClass() { + Set generatorImplementors = findConcreteNamedImplementors(hibernateIndex, + "org.hibernate.id.enhanced.Optimizer"); + + assertThat(ClassNames.OPTIMIZERS) + .containsExactlyInAnyOrderElementsOf(generatorImplementors); + } + @Test public void testNoMissingJpaAnnotation() { Set jpaMappingAnnotations = findRuntimeAnnotations(jpaIndex); @@ -149,7 +158,7 @@ public void testNoMissingJdbcJavaTypeClass() { List typeParams = JandexUtil.resolveTypeParameters(basicJavaTypeImplInfo.name(), basicJavaTypeName, hibernateAndJdkIndex); Type jdbcJavaType = typeParams.get(0); - if (jdbcJavaType.kind() == Type.Kind.CLASS) { + if (jdbcJavaType.kind() == Type.Kind.CLASS || jdbcJavaType.kind() == Type.Kind.PARAMETERIZED_TYPE) { jdbcJavaTypeNames.add(jdbcJavaType.name()); } } 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 4f9fd280eb32d..01e12bc343e2b 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 @@ -360,7 +360,6 @@ public void setId(EmbeddableIdWithAnnotation id) { } } - @MappedSuperclass public interface Identifiable { Object getId(); } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/ApplicationScopedInterceptorTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/ApplicationScopedInterceptorTest.java index 7b4bc97eaaa77..3d672a2627efd 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/ApplicationScopedInterceptorTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/ApplicationScopedInterceptorTest.java @@ -13,6 +13,7 @@ import jakarta.persistence.Table; import jakarta.transaction.UserTransaction; +import org.hibernate.CallbackException; import org.hibernate.Interceptor; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -123,7 +124,8 @@ public ApplicationScopedInterceptor() { } @Override - public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/DependentInterceptorTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/DependentInterceptorTest.java index c1b38cae6fc8b..3b1a3a355c455 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/DependentInterceptorTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/DependentInterceptorTest.java @@ -14,6 +14,7 @@ import jakarta.persistence.Table; import jakarta.transaction.UserTransaction; +import org.hibernate.CallbackException; import org.hibernate.Interceptor; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -126,7 +127,8 @@ public DependentInterceptor() { } @Override - public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/TransactionScopedInterceptorTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/TransactionScopedInterceptorTest.java index c1f1501778442..30037ff2ed292 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/TransactionScopedInterceptorTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/TransactionScopedInterceptorTest.java @@ -15,6 +15,7 @@ import jakarta.transaction.TransactionScoped; import jakarta.transaction.UserTransaction; +import org.hibernate.CallbackException; import org.hibernate.Interceptor; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -128,7 +129,8 @@ public TransactionScopedInterceptor() { } @Override - public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/metadatabuildercontributor/CustomMetadataBuilderContributor.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/metadatabuildercontributor/CustomMetadataBuilderContributor.java index 7537062c57d4c..a2444b83a33bb 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/metadatabuildercontributor/CustomMetadataBuilderContributor.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/metadatabuildercontributor/CustomMetadataBuilderContributor.java @@ -7,7 +7,7 @@ import org.hibernate.boot.MetadataBuilder; import org.hibernate.boot.model.FunctionContributions; import org.hibernate.boot.model.FunctionContributor; -import org.hibernate.query.ReturnableType; +import org.hibernate.metamodel.model.domain.ReturnableType; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.produce.function.StandardArgumentsValidators; import org.hibernate.query.sqm.produce.function.StandardFunctionArgumentTypeResolvers; diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsCdiEntityManagerTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsCdiEntityManagerTest.java index 1a7294613514d..a4a363beac98a 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsCdiEntityManagerTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsCdiEntityManagerTest.java @@ -165,6 +165,6 @@ public void inventoryEntityManagerNoRequestNoTransaction() { public void testUserInInventoryEntityManager() { User user = new User("gsmet"); assertThatThrownBy(() -> inventoryEntityManager.persist(user)).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Unable to locate persister"); + .hasMessageContaining("Unknown entity type"); } } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsCdiSessionTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsCdiSessionTest.java index 60f87c1c63aba..5608c0c73fe8b 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsCdiSessionTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsCdiSessionTest.java @@ -151,6 +151,6 @@ public void inventoryEntityManagerNoRequestNoTransaction() { public void testUserInInventorySession() { User user = new User("gsmet"); assertThatThrownBy(() -> inventorySession.persist(user)).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Unable to locate persister"); + .hasMessageContaining("Unknown entity type"); } } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsInterceptorTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsInterceptorTest.java index 73a064f3aa870..b1fe19e68b155 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsInterceptorTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsInterceptorTest.java @@ -9,6 +9,7 @@ import jakarta.inject.Inject; import jakarta.transaction.UserTransaction; +import org.hibernate.CallbackException; import org.hibernate.Interceptor; import org.hibernate.Session; import org.hibernate.type.Type; @@ -115,7 +116,8 @@ public MyDefaultPUInterceptor() { } @Override - public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } @@ -133,7 +135,8 @@ public MyInventoryPUInterceptor() { } @Override - public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsPackageAnnotationsTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsPackageAnnotationsTest.java index b73c006ce0e46..a1efd45e226c6 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsPackageAnnotationsTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsPackageAnnotationsTest.java @@ -102,6 +102,6 @@ public void testPlane() { public void testUserInInventoryEntityManager() { User user = new User("gsmet"); assertThatThrownBy(() -> inventoryEntityManager.persist(user)).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Unable to locate persister"); + .hasMessageContaining("Unknown entity type"); } } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsResourceInjectionEntityManagerTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsResourceInjectionEntityManagerTest.java index 52a5fafc14ea1..a621a4505f383 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsResourceInjectionEntityManagerTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsResourceInjectionEntityManagerTest.java @@ -54,7 +54,7 @@ public void testPlane() { public void testUserInInventoryEntityManager() { User user = new User("gsmet"); assertThatThrownBy(() -> inventoryEntityManager.persist(user)).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Unable to locate persister"); + .hasMessageContaining("Unknown entity type"); } @Test diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsResourceInjectionSessionTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsResourceInjectionSessionTest.java index 1d5e0ab49a7dc..f2636f5da977e 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsResourceInjectionSessionTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsResourceInjectionSessionTest.java @@ -54,7 +54,7 @@ public void testPlane() { public void testUserInInventorySession() { User user = new User("gsmet"); assertThatThrownBy(() -> inventorySession.persist(user)).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Unable to locate persister"); + .hasMessageContaining("Unknown entity type"); } @Test diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsSchemaManagerTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsSchemaManagerTest.java index 587ce850d841b..81f11e9782fd6 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsSchemaManagerTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsSchemaManagerTest.java @@ -3,8 +3,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import jakarta.inject.Inject; +import jakarta.persistence.SchemaManager; -import org.hibernate.relational.SchemaManager; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -35,6 +35,10 @@ public class MultiplePersistenceUnitsSchemaManagerTest { @PersistenceUnit("inventory") SchemaManager inventorySchemaManager; + @Inject + @PersistenceUnit("users") + org.hibernate.relational.SchemaManager usersHibernateCriteriaBuilder; + @Test public void testDefaultSchemaManager() { assertNotNull(defaultSchemaManager); @@ -49,4 +53,9 @@ public void testUsersSchemaManager() { public void testInventorySchemaManager() { assertNotNull(inventorySchemaManager); } -} \ No newline at end of file + + @Test + public void testUsersHibernateSchemaManager() { + assertNotNull(usersHibernateCriteriaBuilder); + } +} diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java index 06f625ec80d8a..e7c39ebd2e613 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java @@ -61,6 +61,6 @@ public void testIncluded() { public void testExcluded() { ExcludedEntity entity = new ExcludedEntity("gsmet"); assertThatThrownBy(() -> entityManager.persist(entity)).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Unable to locate persister"); + .hasMessageContaining("Unknown entity type"); } } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java index fd7eb0ea4277e..bd3501cb24920 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java @@ -62,6 +62,6 @@ public void testIncluded() { public void testExcluded() { ExcludedEntity entity = new ExcludedEntity("gsmet"); assertThatThrownBy(() -> entityManager.persist(entity)).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Unable to locate persister"); + .hasMessageContaining("Unknown entity type"); } } diff --git a/extensions/hibernate-orm/runtime/pom.xml b/extensions/hibernate-orm/runtime/pom.xml index f3eba2f7633d0..93ffa141453d1 100644 --- a/extensions/hibernate-orm/runtime/pom.xml +++ b/extensions/hibernate-orm/runtime/pom.xml @@ -71,12 +71,6 @@ byte-buddy compile - - - org.hibernate.common - hibernate-commons-annotations - compile - + diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java index 6ac5c7549e57e..0ec16b00187df 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java @@ -10,6 +10,7 @@ import javax.sql.DataSource; import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.PersistenceConfiguration; import jakarta.persistence.PersistenceException; import jakarta.persistence.spi.PersistenceProvider; import jakarta.persistence.spi.PersistenceUnitInfo; @@ -81,6 +82,14 @@ public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitI return getEntityManagerFactoryBuilder(info, properties).build(); } + @Override + public EntityManagerFactory createEntityManagerFactory(PersistenceConfiguration configuration) { + throw new PersistenceException( + "This PersistenceProvider does not support createEntityManagerFactory(PersistenceConfiguration). " + + " Quarkus is responsible for creating the entity manager factory, so inject your entity manager" + + " factory through CDI instead: `@Inject EntityManagerFactory emf`."); + } + @SuppressWarnings("rawtypes") @Override public void generateSchema(PersistenceUnitInfo info, Map map) { 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 c0144eef0a745..df0b070ed3c7a 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 @@ -4,10 +4,12 @@ import java.util.function.Supplier; import jakarta.persistence.EntityGraph; +import jakarta.persistence.TypedQueryReference; import jakarta.persistence.criteria.CriteriaDelete; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.CriteriaUpdate; +import org.hibernate.CacheMode; import org.hibernate.Filter; import org.hibernate.HibernateException; import org.hibernate.LockMode; @@ -25,7 +27,6 @@ import org.hibernate.query.SelectionQuery; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.JpaCriteriaInsert; -import org.hibernate.query.criteria.JpaCriteriaInsertSelect; /** * Plays the exact same role as {@link org.hibernate.engine.spi.SessionLazyDelegator} for {@link org.hibernate.Session} @@ -53,6 +54,11 @@ public Object insert(String entityName, Object entity) { return delegate.get().insert(entityName, entity); } + @Override + public void insertMultiple(List entities) { + delegate.get().insertMultiple(entities); + } + @Override public void update(Object entity) { delegate.get().update(entity); @@ -63,6 +69,11 @@ public void update(String entityName, Object entity) { delegate.get().update(entityName, entity); } + @Override + public void updateMultiple(List entities) { + delegate.get().updateMultiple(entities); + } + @Override public void delete(Object entity) { delegate.get().delete(entity); @@ -73,6 +84,11 @@ public void delete(String entityName, Object entity) { delegate.get().delete(entityName, entity); } + @Override + public void deleteMultiple(List entities) { + delegate.get().deleteMultiple(entities); + } + @Override public Object get(String entityName, Object id) { return delegate.get().get(entityName, id); @@ -93,6 +109,36 @@ public T get(Class entityClass, Object id, LockMode lockMode) { return delegate.get().get(entityClass, id, lockMode); } + @Override + public T get(EntityGraph graph, Object id) { + return delegate.get().get(graph, id); + } + + @Override + public T get(EntityGraph graph, Object id, LockMode lockMode) { + return delegate.get().get(graph, id, lockMode); + } + + @Override + public List getMultiple(Class entityClass, List ids) { + return delegate.get().getMultiple(entityClass, ids); + } + + @Override + public List getMultiple(Class entityClass, List ids, LockMode lockMode) { + return delegate.get().getMultiple(entityClass, ids, lockMode); + } + + @Override + public List getMultiple(EntityGraph entityGraph, List ids) { + return delegate.get().getMultiple(entityGraph, ids); + } + + @Override + public List getMultiple(EntityGraph entityGraph, GraphSemantic graphSemantic, List ids) { + return delegate.get().getMultiple(entityGraph, graphSemantic, ids); + } + @Override public Filter enableFilter(String filterName) { return delegate.get().enableFilter(filterName); @@ -108,11 +154,6 @@ public void disableFilter(String filterName) { delegate.get().disableFilter(filterName); } - @Override - public MutationQuery createMutationQuery(JpaCriteriaInsert insertSelect) { - return delegate.get().createMutationQuery(insertSelect); - } - @Override public void refresh(Object entity) { delegate.get().refresh(entity); @@ -276,6 +317,11 @@ public Query createQuery(CriteriaDelete deleteQuery) { return delegate.get().createQuery(deleteQuery); } + @Override + public Query createQuery(TypedQueryReference typedQueryReference) { + return delegate.get().createQuery(typedQueryReference); + } + @Override @Deprecated(since = "6.0") public NativeQuery createNativeQuery(String sqlString) { @@ -318,6 +364,11 @@ public SelectionQuery createSelectionQuery(CriteriaQuery criteria) { return delegate.get().createSelectionQuery(criteria); } + @Override + public SelectionQuery createSelectionQuery(String hqlString, EntityGraph resultGraph) { + return delegate.get().createSelectionQuery(hqlString, resultGraph); + } + @Override public MutationQuery createMutationQuery(String hqlString) { return delegate.get().createMutationQuery(hqlString); @@ -334,8 +385,8 @@ public MutationQuery createMutationQuery(CriteriaDelete deleteQuery) { } @Override - public MutationQuery createMutationQuery(JpaCriteriaInsertSelect insertSelect) { - return delegate.get().createMutationQuery(insertSelect); + public MutationQuery createMutationQuery(JpaCriteriaInsert insert) { + return delegate.get().createMutationQuery(insert); } @Override @@ -427,6 +478,11 @@ public void upsert(String entityName, Object entity) { delegate.get().upsert(entityName, entity); } + @Override + public void upsertMultiple(List entities) { + delegate.get().upsertMultiple(entities); + } + @Override public T get(EntityGraph graph, GraphSemantic graphSemantic, Object id) { return delegate.get().get(graph, graphSemantic, id); @@ -436,4 +492,14 @@ public T get(EntityGraph graph, GraphSemantic graphSemantic, Object id) { public T get(EntityGraph graph, GraphSemantic graphSemantic, Object id, LockMode lockMode) { return delegate.get().get(graph, graphSemantic, id, lockMode); } + + @Override + public CacheMode getCacheMode() { + return delegate.get().getCacheMode(); + } + + @Override + public void setCacheMode(CacheMode cacheMode) { + delegate.get().setCacheMode(cacheMode); + } } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootEntityManagerFactoryBuilder.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootEntityManagerFactoryBuilder.java index 4c2482185a365..c944f53544c94 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootEntityManagerFactoryBuilder.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootEntityManagerFactoryBuilder.java @@ -136,12 +136,6 @@ protected void populate(String persistenceUnitName, SessionFactoryOptionsBuilder options.disableJtaTransactionAccess(); } - final boolean allowRefreshDetachedEntity = runtimeSettings.getBoolean( - org.hibernate.cfg.AvailableSettings.ALLOW_REFRESH_DETACHED_ENTITY); - if (!allowRefreshDetachedEntity) { - options.disableRefreshDetachedEntity(); - } - //Check for use of deprecated org.hibernate.jpa.AvailableSettings.SESSION_FACTORY_OBSERVER final Object legacyObserver = runtimeSettings.get("hibernate.ejb.session_factory_observer"); if (legacyObserver != null) { 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 38fb9920b26fc..93f8990e6c52a 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 @@ -14,7 +14,7 @@ import static org.hibernate.cfg.AvailableSettings.URL; import static org.hibernate.cfg.AvailableSettings.USER; import static org.hibernate.cfg.AvailableSettings.XML_MAPPING_ENABLED; -import static org.hibernate.internal.HEMLogging.messageLogger; +import static org.hibernate.internal.CoreLogging.messageLogger; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; @@ -30,7 +30,7 @@ import java.util.stream.Collectors; import jakarta.persistence.PersistenceException; -import jakarta.persistence.spi.PersistenceUnitTransactionType; +import jakarta.persistence.PersistenceUnitTransactionType; import org.hibernate.boot.CacheRegionDefinition; import org.hibernate.boot.MetadataBuilder; @@ -50,7 +50,7 @@ import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.dialect.spi.DialectFactory; import org.hibernate.integrator.spi.Integrator; -import org.hibernate.internal.EntityManagerMessageLogger; +import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.util.StringHelper; import org.hibernate.jpa.boot.internal.StandardJpaScanEnvironmentImpl; import org.hibernate.jpa.boot.spi.JpaSettings; @@ -98,7 +98,7 @@ public class FastBootMetadataBuilder { @Deprecated private static final String ALLOW_ENHANCEMENT_AS_PROXY = "hibernate.bytecode.allow_enhancement_as_proxy"; - private static final EntityManagerMessageLogger LOG = messageLogger(FastBootMetadataBuilder.class); + private static final CoreMessageLogger LOG = messageLogger(FastBootMetadataBuilder.class); private final PersistenceUnitDescriptor persistenceUnit; private final BuildTimeSettings buildTimeSettings; @@ -272,6 +272,9 @@ private MergedSettings mergeSettings(QuarkusPersistenceUnitDefinition puDefiniti cfg.put("hibernate.boot.allow_jdbc_metadata_access", "false"); + // Disallow CDI during metadata building in anticipation for https://github.com/quarkusio/quarkus/issues/40897 + cfg.put(AvailableSettings.ALLOW_EXTENSIONS_IN_CDI, "false"); + //This shouldn't be encouraged, but sometimes it's really useful - and it used to be the default //in Hibernate ORM before the JPA spec would require to change this. //At this time of transitioning we'll only expose it as a global system property, so to allow usage @@ -593,7 +596,7 @@ private static void applyTransactionProperties(PersistenceUnitDescriptor persist PersistenceUnitTransactionType transactionType = PersistenceUnitTransactionTypeHelper .interpretTransactionType(configurationValues.get(JPA_TRANSACTION_TYPE)); if (transactionType == null) { - transactionType = persistenceUnit.getTransactionType(); + transactionType = persistenceUnit.getPersistenceUnitTransactionType(); } if (transactionType == null) { // is it more appropriate to have this be based on bootstrap entry point (EE vs SE)? diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/QuarkusPersistenceUnitDescriptor.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/QuarkusPersistenceUnitDescriptor.java index 7aae162732663..00bbda4204fc5 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/QuarkusPersistenceUnitDescriptor.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/QuarkusPersistenceUnitDescriptor.java @@ -6,13 +6,14 @@ import java.util.Objects; import java.util.Properties; +import jakarta.persistence.PersistenceUnitTransactionType; import jakarta.persistence.SharedCacheMode; import jakarta.persistence.ValidationMode; -import jakarta.persistence.spi.PersistenceUnitTransactionType; import org.hibernate.bytecode.enhance.spi.EnhancementContext; import org.hibernate.bytecode.spi.ClassTransformer; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; +import org.hibernate.jpa.internal.util.PersistenceUnitTransactionTypeHelper; import io.quarkus.runtime.annotations.RecordableConstructor; @@ -25,7 +26,7 @@ public final class QuarkusPersistenceUnitDescriptor implements PersistenceUnitDe private final String configurationName; private final String providerClassName; private final boolean useQuotedIdentifiers; - private final PersistenceUnitTransactionType transactionType; + private final PersistenceUnitTransactionType persistenceUnitTransactionType; private final ValidationMode validationMode; private final SharedCacheMode sharedCacheMode; private final List managedClassNames; @@ -33,14 +34,14 @@ public final class QuarkusPersistenceUnitDescriptor implements PersistenceUnitDe private final boolean reactive; public QuarkusPersistenceUnitDescriptor(String name, String configurationName, - PersistenceUnitTransactionType transactionType, + PersistenceUnitTransactionType persistenceUnitTransactionType, List managedClassNames, Properties properties, boolean reactive) { this.name = name; this.configurationName = configurationName; this.providerClassName = null; this.useQuotedIdentifiers = false; - this.transactionType = transactionType; + this.persistenceUnitTransactionType = persistenceUnitTransactionType; this.validationMode = null; this.sharedCacheMode = null; this.managedClassNames = managedClassNames; @@ -57,14 +58,14 @@ public QuarkusPersistenceUnitDescriptor(String name, String configurationName, @RecordableConstructor public QuarkusPersistenceUnitDescriptor(String name, String configurationName, String providerClassName, boolean useQuotedIdentifiers, - PersistenceUnitTransactionType transactionType, + PersistenceUnitTransactionType persistenceUnitTransactionType, ValidationMode validationMode, SharedCacheMode sharedCacheMode, List managedClassNames, Properties properties, boolean reactive) { this.name = name; this.configurationName = configurationName; this.providerClassName = providerClassName; this.useQuotedIdentifiers = useQuotedIdentifiers; - this.transactionType = transactionType; + this.persistenceUnitTransactionType = persistenceUnitTransactionType; this.validationMode = validationMode; this.sharedCacheMode = sharedCacheMode; this.managedClassNames = managedClassNames; @@ -89,7 +90,7 @@ public static QuarkusPersistenceUnitDescriptor validateAndReadFrom(PersistenceUn verifyIgnoredFields(toClone); return new QuarkusPersistenceUnitDescriptor(toClone.getName(), toClone.getName(), toClone.getProviderClassName(), toClone.isUseQuotedIdentifiers(), - toClone.getTransactionType(), toClone.getValidationMode(), toClone.getSharedCacheMode(), + toClone.getPersistenceUnitTransactionType(), toClone.getValidationMode(), toClone.getSharedCacheMode(), Collections.unmodifiableList(toClone.getManagedClassNames()), toClone.getProperties(), false); } @@ -124,8 +125,15 @@ public boolean isExcludeUnlistedClasses() { } @Override - public PersistenceUnitTransactionType getTransactionType() { - return transactionType; + public PersistenceUnitTransactionType getPersistenceUnitTransactionType() { + return persistenceUnitTransactionType; + } + + @Override + @Deprecated + @SuppressWarnings("removal") + public jakarta.persistence.spi.PersistenceUnitTransactionType getTransactionType() { + return PersistenceUnitTransactionTypeHelper.toDeprecatedForm(getPersistenceUnitTransactionType()); } @Override @@ -220,7 +228,7 @@ public String toString() { ", configurationName='" + configurationName + '\'' + ", providerClassName='" + providerClassName + '\'' + ", useQuotedIdentifiers=" + useQuotedIdentifiers + - ", transactionType=" + transactionType + + ", transactionType=" + persistenceUnitTransactionType + ", validationMode=" + validationMode + ", sharedCacheMode=" + sharedCacheMode + ", managedClassNames=" + managedClassNames + 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 9f517c2d2b38f..79e4a155f0a92 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 @@ -8,9 +8,9 @@ import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.StandardServiceInitiator; +import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.internal.BootstrapServiceRegistryImpl; import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl; -import org.hibernate.boot.registry.selector.internal.StrategySelectorImpl; import org.hibernate.engine.config.internal.ConfigurationServiceInitiator; import org.hibernate.engine.jdbc.batch.internal.BatchBuilderInitiator; import org.hibernate.engine.jdbc.connections.internal.MultiTenantConnectionProviderInitiator; @@ -38,6 +38,7 @@ import io.quarkus.hibernate.orm.runtime.customized.QuarkusJtaPlatformInitiator; import io.quarkus.hibernate.orm.runtime.customized.QuarkusRuntimeProxyFactoryFactory; import io.quarkus.hibernate.orm.runtime.customized.QuarkusRuntimeProxyFactoryFactoryInitiator; +import io.quarkus.hibernate.orm.runtime.customized.QuarkusStrategySelectorBuilder; import io.quarkus.hibernate.orm.runtime.recording.RecordedState; import io.quarkus.hibernate.orm.runtime.service.CfgXmlAccessServiceInitiatorQuarkus; import io.quarkus.hibernate.orm.runtime.service.FlatClassLoaderService; @@ -127,16 +128,18 @@ public StandardServiceRegistryImpl buildNewServiceRegistry() { } private BootstrapServiceRegistry buildEmptyBootstrapServiceRegistry() { + final ClassLoaderService providedClassLoaderService = FlatClassLoaderService.INSTANCE; // N.B. support for custom IntegratorProvider injected via Properties (as // instance) removed // N.B. support for custom StrategySelector is not implemented yet - final StrategySelectorImpl strategySelector = new StrategySelectorImpl(FlatClassLoaderService.INSTANCE); + // A non-empty selector is needed in order to support ID generators that retrieve a naming strategy -- at runtime! + var strategySelector = QuarkusStrategySelectorBuilder.buildRuntimeSelector(providedClassLoaderService); return new BootstrapServiceRegistryImpl(true, - FlatClassLoaderService.INSTANCE, + providedClassLoaderService, strategySelector, // new MirroringStrategySelector(), new MirroringIntegratorService(integrators)); } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/xml/RecordableXmlMapping.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/xml/RecordableXmlMapping.java index be4e57bcbad95..f8c2301e470a6 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/xml/RecordableXmlMapping.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/xml/RecordableXmlMapping.java @@ -3,8 +3,9 @@ import org.hibernate.boot.jaxb.Origin; import org.hibernate.boot.jaxb.SourceType; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmHibernateMapping; -import org.hibernate.boot.jaxb.mapping.JaxbEntityMappings; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; import org.hibernate.boot.jaxb.spi.Binding; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; import io.quarkus.runtime.annotations.RecordableConstructor; @@ -16,17 +17,17 @@ */ public class RecordableXmlMapping { // The following two properties are mutually exclusive: exactly one of them is non-null. - private final JaxbEntityMappings ormXmlRoot; + private final JaxbEntityMappingsImpl ormXmlRoot; private final JaxbHbmHibernateMapping hbmXmlRoot; private final SourceType originType; private final String originName; - public static RecordableXmlMapping create(Binding binding) { - Object root = binding.getRoot(); + public static RecordableXmlMapping create(Binding binding) { + JaxbBindableMappingDescriptor root = binding.getRoot(); Origin origin = binding.getOrigin(); - if (root instanceof JaxbEntityMappings) { - return new RecordableXmlMapping((JaxbEntityMappings) root, null, origin.getType(), origin.getName()); + if (root instanceof JaxbEntityMappingsImpl) { + return new RecordableXmlMapping((JaxbEntityMappingsImpl) root, null, origin.getType(), origin.getName()); } else if (root instanceof JaxbHbmHibernateMapping) { return new RecordableXmlMapping(null, (JaxbHbmHibernateMapping) root, origin.getType(), origin.getName()); } else { @@ -35,7 +36,7 @@ public static RecordableXmlMapping create(Binding binding) { } @RecordableConstructor - public RecordableXmlMapping(JaxbEntityMappings ormXmlRoot, JaxbHbmHibernateMapping hbmXmlRoot, SourceType originType, + public RecordableXmlMapping(JaxbEntityMappingsImpl ormXmlRoot, JaxbHbmHibernateMapping hbmXmlRoot, SourceType originType, String originName) { this.ormXmlRoot = ormXmlRoot; this.hbmXmlRoot = hbmXmlRoot; @@ -50,7 +51,7 @@ public String toString() { '}'; } - public JaxbEntityMappings getOrmXmlRoot() { + public JaxbEntityMappingsImpl getOrmXmlRoot() { return ormXmlRoot; } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusProxyFactory.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusProxyFactory.java index e6321bdb460fc..2a587db45fde3 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusProxyFactory.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusProxyFactory.java @@ -93,7 +93,9 @@ public HibernateProxy getProxy( ((ProxyConfiguration) proxy).$$_hibernate_set_interceptor(interceptor); return proxy; } catch (Throwable t) { - String logMessage = LOG.bytecodeEnhancementFailed(entityName); + String logMessage = "Bytecode enhancement failed for class '" + entityName + + "' (it might be due to the Java module system preventing Hibernate ORM from defining an enhanced class in the same package" + + " - in this case, the class should be opened and exported to Hibernate ORM)"; LOG.error(logMessage, t); throw new HibernateException(logMessage, t); } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusStrategySelectorBuilder.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusStrategySelectorBuilder.java index 35a4cdfd0b356..4e9392719d3ce 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusStrategySelectorBuilder.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/customized/QuarkusStrategySelectorBuilder.java @@ -9,9 +9,10 @@ import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.selector.StrategyRegistration; import org.hibernate.boot.registry.selector.StrategyRegistrationProvider; -import org.hibernate.boot.registry.selector.internal.DefaultDialectSelector; +import org.hibernate.boot.registry.selector.internal.AggregatedDialectSelector; import org.hibernate.boot.registry.selector.internal.DefaultJtaPlatformSelector; import org.hibernate.boot.registry.selector.internal.StrategySelectorImpl; +import org.hibernate.boot.registry.selector.spi.DialectSelector; import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.cache.internal.DefaultCacheKeysFactory; import org.hibernate.cache.internal.SimpleCacheKeysFactory; @@ -22,10 +23,15 @@ import org.hibernate.id.enhanced.LegacyNamingStrategy; import org.hibernate.id.enhanced.SingleNamingStrategy; import org.hibernate.id.enhanced.StandardNamingStrategy; +import org.hibernate.query.sqm.mutation.internal.cte.CteInsertStrategy; import org.hibernate.query.sqm.mutation.internal.cte.CteMutationStrategy; +import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableInsertStrategy; import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableMutationStrategy; +import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableInsertStrategy; import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableMutationStrategy; +import org.hibernate.query.sqm.mutation.internal.temptable.PersistentTableInsertStrategy; import org.hibernate.query.sqm.mutation.internal.temptable.PersistentTableMutationStrategy; +import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy; import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy; import org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorBuilderImpl; import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl; @@ -59,9 +65,10 @@ public static StrategySelector buildSelector(ClassLoaderService classLoaderServi // build the baseline... strategySelector.registerStrategyLazily( Dialect.class, - new DefaultDialectSelector()); + new AggregatedDialectSelector(classLoaderService.loadJavaServices(DialectSelector.class))); strategySelector.registerStrategyLazily(JtaPlatform.class, new DefaultJtaPlatformSelector()); addTransactionCoordinatorBuilders(strategySelector); + addSqmMultiTableInsertStrategies(strategySelector); addSqmMultiTableMutationStrategies(strategySelector); addImplicitNamingStrategies(strategySelector); addColumnOrderingStrategies(strategySelector); @@ -80,9 +87,23 @@ public static StrategySelector buildSelector(ClassLoaderService classLoaderServi return strategySelector; } - @SuppressWarnings("unchecked") - private static void applyFromStrategyRegistration( - StrategySelectorImpl strategySelector, + /** + * Builds the selector for runtime use. + * + * @param classLoaderService The class loading service used to (attempt to) resolve any un-registered + * strategy implementations. + * + * @return The selector. + */ + public static StrategySelector buildRuntimeSelector(ClassLoaderService classLoaderService) { + final StrategySelectorImpl strategySelector = new StrategySelectorImpl(classLoaderService); + + addImplicitNamingStrategies(strategySelector); + + return strategySelector; + } + + private static void applyFromStrategyRegistration(StrategySelectorImpl strategySelector, StrategyRegistration strategyRegistration) { for (String name : strategyRegistration.getSelectorNames()) { strategySelector.registerStrategyImplementor( @@ -103,6 +124,25 @@ private static void addTransactionCoordinatorBuilders(StrategySelectorImpl strat JtaTransactionCoordinatorBuilderImpl.class); } + private static void addSqmMultiTableInsertStrategies(StrategySelectorImpl strategySelector) { + strategySelector.registerStrategyImplementor( + SqmMultiTableInsertStrategy.class, + CteInsertStrategy.SHORT_NAME, + CteInsertStrategy.class); + strategySelector.registerStrategyImplementor( + SqmMultiTableInsertStrategy.class, + GlobalTemporaryTableInsertStrategy.SHORT_NAME, + GlobalTemporaryTableInsertStrategy.class); + strategySelector.registerStrategyImplementor( + SqmMultiTableInsertStrategy.class, + LocalTemporaryTableInsertStrategy.SHORT_NAME, + LocalTemporaryTableInsertStrategy.class); + strategySelector.registerStrategyImplementor( + SqmMultiTableInsertStrategy.class, + PersistentTableInsertStrategy.SHORT_NAME, + PersistentTableInsertStrategy.class); + } + private static void addSqmMultiTableMutationStrategies(StrategySelectorImpl strategySelector) { strategySelector.registerStrategyImplementor( SqmMultiTableMutationStrategy.class, @@ -192,5 +232,4 @@ private static void addXmlFormatMappers(StrategySelectorImpl strategySelector) { JaxbXmlFormatMapper.SHORT_NAME, JaxbXmlFormatMapper.class); } - } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/dev/HibernateOrmDevIntegrator.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/dev/HibernateOrmDevIntegrator.java index 01b8ef08003b0..e3c00c7fc67ab 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/dev/HibernateOrmDevIntegrator.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/dev/HibernateOrmDevIntegrator.java @@ -3,19 +3,21 @@ import static org.hibernate.cfg.AvailableSettings.HBM2DDL_IMPORT_FILES; import org.hibernate.boot.Metadata; +import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.integrator.spi.Integrator; import org.hibernate.service.spi.SessionFactoryServiceRegistry; public class HibernateOrmDevIntegrator implements Integrator { + @Override - public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactoryImplementor, - SessionFactoryServiceRegistry sessionFactoryServiceRegistry) { + public void integrate(Metadata metadata, BootstrapContext bootstrapContext, + SessionFactoryImplementor sessionFactoryImplementor) { HibernateOrmDevController.get().pushPersistenceUnit( sessionFactoryImplementor, (String) sessionFactoryImplementor.getProperties() .get(org.hibernate.cfg.AvailableSettings.PERSISTENCE_UNIT_NAME), - metadata, sessionFactoryServiceRegistry, + metadata, sessionFactoryImplementor.getServiceRegistry(), (String) sessionFactoryImplementor.getProperties().get(HBM2DDL_IMPORT_FILES)); } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/proxies/ProxyDefinitions.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/proxies/ProxyDefinitions.java index 7c0bdfbe8fd45..4d8ced3ebe293 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/proxies/ProxyDefinitions.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/proxies/ProxyDefinitions.java @@ -103,9 +103,13 @@ private static Class generateProxyClass(PersistentClass persistentClass, final String entityName = persistentClass.getEntityName(); final Class mappedClass = persistentClass.getMappedClass(); if (Modifier.isFinal(mappedClass.getModifiers())) { - LOGGER.warn("Could not generate an enhanced proxy for entity '" + entityName + "' (class='" - + mappedClass.getCanonicalName() - + "') as it's final. Your application might perform better if we're allowed to extend it."); + // Some Envers entity classes are final, e.g. org.hibernate.envers.DefaultRevisionEntity + // There's nothing users can do about it, so let's not warn in those cases. + if (!mappedClass.getName().startsWith("org.hibernate.")) { + LOGGER.warn("Could not generate an enhanced proxy for entity '" + entityName + "' (class='" + + mappedClass.getCanonicalName() + + "') as it's final. Your application might perform better if we're allowed to extend it."); + } return null; } final java.util.Set> proxyInterfaces = org.hibernate.proxy.pojo.ProxyFactoryHelper 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 35410e3c43126..5e70aac7f3123 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 @@ -9,7 +9,6 @@ import java.util.function.Supplier; import org.hibernate.MappingException; -import org.hibernate.SessionFactory; import org.hibernate.boot.SessionFactoryBuilder; import org.hibernate.boot.internal.MetadataImpl; import org.hibernate.boot.internal.SessionFactoryOptionsBuilder; @@ -60,7 +59,6 @@ private PrevalidatedQuarkusMetadata(final MetadataImpl metadata) { public static PrevalidatedQuarkusMetadata validateAndWrap(final MetadataImpl original) { original.validate(); - original.getBootstrapContext().getReflectionManager().reset(); return new PrevalidatedQuarkusMetadata(original); } @@ -91,7 +89,7 @@ public SessionFactoryBuilder getSessionFactoryBuilder() { } @Override - public SessionFactory buildSessionFactory() { + public SessionFactoryImplementor buildSessionFactory() { //Ensure we don't boot Hibernate using this, but rather use the #buildSessionFactoryOptionsBuilder above. throw new IllegalStateException("This method is not supposed to be used in Quarkus"); } @@ -144,7 +142,7 @@ public NamedHqlQueryDefinition getNamedHqlQueryMapping(String name) { } @Override - public void visitNamedHqlQueryDefinitions(Consumer definitionConsumer) { + public void visitNamedHqlQueryDefinitions(Consumer> definitionConsumer) { metadata.visitNamedHqlQueryDefinitions(definitionConsumer); } @@ -154,7 +152,7 @@ public NamedNativeQueryDefinition getNamedNativeQueryMapping(String name) { } @Override - public void visitNamedNativeQueryDefinitions(Consumer definitionConsumer) { + public void visitNamedNativeQueryDefinitions(Consumer> definitionConsumer) { metadata.visitNamedNativeQueryDefinitions(definitionConsumer); } @@ -268,8 +266,8 @@ public SqmFunctionRegistry getFunctionRegistry() { } @Override - public NamedObjectRepository buildNamedQueryRepository(SessionFactoryImplementor sessionFactory) { - return metadata.buildNamedQueryRepository(sessionFactory); + public NamedObjectRepository buildNamedQueryRepository() { + return metadata.buildNamedQueryRepository(); } @Override @@ -335,11 +333,11 @@ public BootstrapContext getBootstrapContext() { return metadata.getBootstrapContext(); } - public Map getNamedQueryMap() { + public Map> getNamedQueryMap() { return metadata.getNamedQueryMap(); } - public Map getNamedNativeQueryMap() { + public Map> getNamedNativeQueryMap() { return metadata.getNamedNativeQueryMap(); } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/recording/RecordableBootstrap.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/recording/RecordableBootstrap.java index 63bf1af0762fd..082223d5737a1 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/recording/RecordableBootstrap.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/recording/RecordableBootstrap.java @@ -140,8 +140,9 @@ public StandardServiceRegistryBuilder applySettings(Map settings } @Override - public void clearSettings() { + public StandardServiceRegistryBuilder clearSettings() { settings.clear(); + return this; } /** diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/schema/SchemaManagementIntegrator.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/schema/SchemaManagementIntegrator.java index 0fc363fd702cb..eb9c954d2b6f1 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/schema/SchemaManagementIntegrator.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/schema/SchemaManagementIntegrator.java @@ -10,21 +10,21 @@ import java.util.concurrent.ConcurrentHashMap; import org.hibernate.boot.Metadata; +import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.integrator.spi.Integrator; import org.hibernate.service.ServiceRegistry; +import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.service.spi.SessionFactoryServiceRegistry; import org.hibernate.tool.schema.SourceType; import org.hibernate.tool.schema.TargetType; -import org.hibernate.tool.schema.internal.DefaultSchemaFilter; import org.hibernate.tool.schema.internal.exec.ScriptTargetOutputToWriter; import org.hibernate.tool.schema.spi.CommandAcceptanceException; import org.hibernate.tool.schema.spi.ContributableMatcher; import org.hibernate.tool.schema.spi.ExceptionHandler; import org.hibernate.tool.schema.spi.ExecutionOptions; import org.hibernate.tool.schema.spi.SchemaDropper; -import org.hibernate.tool.schema.spi.SchemaFilter; import org.hibernate.tool.schema.spi.SchemaManagementException; import org.hibernate.tool.schema.spi.SchemaManagementTool; import org.hibernate.tool.schema.spi.SchemaMigrator; @@ -49,10 +49,10 @@ public class SchemaManagementIntegrator implements Integrator, DatabaseSchemaPro .synchronizedMap(new IdentityHashMap<>()); @Override - public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, - SessionFactoryServiceRegistry serviceRegistry) { + public void integrate(Metadata metadata, BootstrapContext bootstrapContext, + SessionFactoryImplementor sessionFactory) { String name = defaultName(sessionFactory); - metadataMap.put(name, new Holder(metadata, sessionFactory, serviceRegistry)); + metadataMap.put(name, new Holder(metadata, sessionFactory, sessionFactory.getServiceRegistry())); nameCache.put(sessionFactory, name); } @@ -186,9 +186,9 @@ public void resetAllDatabases() { static class Holder { final Metadata metadata; final SessionFactoryImplementor sessionFactory; - final SessionFactoryServiceRegistry serviceRegistry; + final ServiceRegistryImplementor serviceRegistry; - Holder(Metadata metadata, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { + Holder(Metadata metadata, SessionFactoryImplementor sessionFactory, ServiceRegistryImplementor serviceRegistry) { this.metadata = metadata; this.sessionFactory = sessionFactory; this.serviceRegistry = serviceRegistry; @@ -221,11 +221,6 @@ public void handleException(CommandAcceptanceException exception) { } }; } - - @Override - public SchemaFilter getSchemaFilter() { - return DefaultSchemaFilter.INSTANCE; - } } private static class SimpleSourceDescriptor implements SourceDescriptor { diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/FlatClassLoaderService.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/FlatClassLoaderService.java index c15ac900d249c..a238a385b1d01 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/FlatClassLoaderService.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/FlatClassLoaderService.java @@ -93,8 +93,7 @@ public Collection loadJavaServices(Class serviceContract) { } @Override - @SuppressWarnings("rawtypes") - public T generateProxy(InvocationHandler handler, Class... interfaces) { + public T generateProxy(InvocationHandler handler, Class... interfaces) { throw new AssertionFailure("Not implemented! generateProxy(InvocationHandler handler, Class... interfaces)"); } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusIdentifierGeneratorFactoryInitiator.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusIdentifierGeneratorFactoryInitiator.java deleted file mode 100644 index 3e9ca583f83fb..0000000000000 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusIdentifierGeneratorFactoryInitiator.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.quarkus.hibernate.orm.runtime.service; - -import java.util.Map; - -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; - -/** - * Uses a StandardIdentifierGeneratorFactory, but one that doesn't retrieve generators from CDI. - * - * @see IdentifierGeneratorFactory - */ -public final class QuarkusIdentifierGeneratorFactoryInitiator - implements StandardServiceInitiator { - - @Override - public IdentifierGeneratorFactory initiateService(final Map configurationValues, - final ServiceRegistryImplementor registry) { - return new StandardIdentifierGeneratorFactory(registry, true /* ignore bean container */); - } - - @Override - public Class getServiceInitiated() { - return IdentifierGeneratorFactory.class; - } - -} diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusRuntimeInitDialectFactory.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusRuntimeInitDialectFactory.java index 5924d80eac29b..113af3481f94c 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusRuntimeInitDialectFactory.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/service/QuarkusRuntimeInitDialectFactory.java @@ -1,6 +1,6 @@ package io.quarkus.hibernate.orm.runtime.service; -import static org.hibernate.internal.HEMLogging.messageLogger; +import static org.hibernate.internal.CoreLogging.messageLogger; import java.sql.SQLException; import java.util.Locale; @@ -13,7 +13,7 @@ import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.dialect.spi.DialectFactory; import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfoSource; -import org.hibernate.internal.EntityManagerMessageLogger; +import org.hibernate.internal.CoreMessageLogger; import io.quarkus.datasource.common.runtime.DataSourceUtil; import io.quarkus.hibernate.orm.runtime.HibernateOrmRuntimeConfig; @@ -27,7 +27,7 @@ * @see QuarkusStaticInitDialectFactory */ public class QuarkusRuntimeInitDialectFactory implements DialectFactory { - private static final EntityManagerMessageLogger LOG = messageLogger(QuarkusRuntimeInitDialectFactory.class); + private static final CoreMessageLogger LOG = messageLogger(QuarkusRuntimeInitDialectFactory.class); private final String persistenceUnitName; private final boolean isFromPersistenceXml; private final Dialect dialect; 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 d84ce1479e999..adf7e54d5c349 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 @@ -81,9 +81,6 @@ public List> initialInitiatorList() { serviceInitiators.add(JdbcServicesInitiator.INSTANCE); serviceInitiators.add(RefCursorSupportInitiator.INSTANCE); - // Custom one! - serviceInitiators.add(new QuarkusIdentifierGeneratorFactoryInitiator()); - serviceInitiators.add(QuarkusJtaPlatformInitiator.INSTANCE); serviceInitiators.add(SessionFactoryServiceRegistryFactoryInitiator.INSTANCE); diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedSession.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedSession.java index 415e93fcf119d..c0d58316cadc7 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedSession.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/session/TransactionScopedSession.java @@ -1,5 +1,6 @@ package io.quarkus.hibernate.orm.runtime.session; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -7,14 +8,23 @@ import jakarta.enterprise.inject.Instance; import jakarta.persistence.CacheRetrieveMode; import jakarta.persistence.CacheStoreMode; +import jakarta.persistence.ConnectionConsumer; +import jakarta.persistence.ConnectionFunction; import jakarta.persistence.EntityGraph; import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.FindOption; import jakarta.persistence.FlushModeType; import jakarta.persistence.LockModeType; +import jakarta.persistence.LockOption; +import jakarta.persistence.RefreshOption; import jakarta.persistence.TransactionRequiredException; +import jakarta.persistence.TypedQuery; +import jakarta.persistence.TypedQueryReference; import jakarta.persistence.criteria.CriteriaDelete; import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.CriteriaSelect; import jakarta.persistence.criteria.CriteriaUpdate; +import jakarta.persistence.metamodel.EntityType; import jakarta.persistence.metamodel.Metamodel; import jakarta.transaction.Status; import jakarta.transaction.TransactionManager; @@ -49,7 +59,6 @@ import org.hibernate.query.SelectionQuery; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.JpaCriteriaInsert; -import org.hibernate.query.criteria.JpaCriteriaInsertSelect; import org.hibernate.stat.SessionStatistics; import io.quarkus.arc.Arc; @@ -213,6 +222,38 @@ public T find(Class entityClass, Object primaryKey, LockModeType lockMode } } + @Override + public T find(Class entityClass, Object primaryKey, FindOption... options) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.session.find(entityClass, primaryKey, options); + } + } + + @Override + public T find(EntityGraph entityGraph, Object primaryKey, FindOption... options) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.session.find(entityGraph, primaryKey, options); + } + } + + @Override + public List findMultiple(Class entityType, List ids, FindOption... options) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.session.findMultiple(entityType, ids, options); + } + } + + @Override + public List findMultiple(EntityGraph entityGraph, List ids, FindOption... options) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.session.findMultiple(entityGraph, ids, options); + } + } + @Override public T getReference(Class entityClass, Object primaryKey) { checkBlocking(); @@ -328,6 +369,17 @@ public void refresh(Object entity, LockModeType lockMode, Map pr } } + @Override + public void refresh(Object entity, RefreshOption... options) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + if (!emr.allowModification) { + throw new TransactionRequiredException(TRANSACTION_IS_NOT_ACTIVE); + } + emr.session.refresh(entity, options); + } + } + @Override public void clear() { try (SessionResult emr = acquireSession()) { @@ -389,6 +441,14 @@ public Query createQuery(CriteriaQuery criteriaQuery) { } } + @Override + public TypedQuery createQuery(CriteriaSelect selectQuery) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.session.createQuery(selectQuery); + } + } + @Deprecated @Override public Query createQuery(CriteriaUpdate updateQuery) { @@ -415,6 +475,14 @@ public Query createQuery(String qlString, Class resultClass) { } } + @Override + public Query createQuery(TypedQueryReference typedQueryReference) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.session.createQuery(typedQueryReference); + } + } + @Deprecated @Override public Query createNamedQuery(String name) { @@ -707,60 +775,6 @@ public void evict(Object object) { } } - @Deprecated - @Override - public T load(Class theClass, Object id, LockMode lockMode) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - return emr.session.load(theClass, id, lockMode); - } - } - - @Deprecated - @Override - public T load(Class theClass, Object id, LockOptions lockOptions) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - return emr.session.load(theClass, id, lockOptions); - } - } - - @Deprecated - @Override - public Object load(String entityName, Object id, LockMode lockMode) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - return emr.session.load(entityName, id, lockMode); - } - } - - @Deprecated - @Override - public Object load(String entityName, Object id, LockOptions lockOptions) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - return emr.session.load(entityName, id, lockOptions); - } - } - - @Deprecated - @Override - public T load(Class theClass, Object id) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - return emr.session.load(theClass, id); - } - } - - @Deprecated - @Override - public Object load(String entityName, Object id) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - return emr.session.load(entityName, id); - } - } - @Override public void load(Object object, Object id) { checkBlocking(); @@ -787,60 +801,6 @@ public void replicate(String entityName, Object object, ReplicationMode replicat } } - @Deprecated - @Override - public Object save(Object object) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - return emr.session.save(object); - } - } - - @Deprecated - @Override - public Object save(String entityName, Object object) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - return emr.session.save(entityName, object); - } - } - - @Deprecated - @Override - public void saveOrUpdate(Object object) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - emr.session.saveOrUpdate(object); - } - } - - @Deprecated - @Override - public void saveOrUpdate(String entityName, Object object) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - emr.session.saveOrUpdate(entityName, object); - } - } - - @Deprecated - @Override - public void update(Object object) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - emr.session.update(object); - } - } - - @Deprecated - @Override - public void update(String entityName, Object object) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - emr.session.update(entityName, object); - } - } - @Override public T merge(String entityName, T object) { checkBlocking(); @@ -850,28 +810,18 @@ public T merge(String entityName, T object) { } @Override - public void persist(String entityName, Object object) { + public T merge(T object, EntityGraph loadGraph) { checkBlocking(); try (SessionResult emr = acquireSession()) { - emr.session.persist(entityName, object); + return emr.session.merge(object, loadGraph); } } - @Deprecated @Override - public void delete(Object object) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - emr.session.delete(object); - } - } - - @Deprecated - @Override - public void delete(String entityName, Object object) { + public void persist(String entityName, Object object) { checkBlocking(); try (SessionResult emr = acquireSession()) { - emr.session.delete(entityName, object); + emr.session.persist(entityName, object); } } @@ -884,42 +834,24 @@ public void lock(Object object, LockMode lockMode) { } @Override - public void lock(Object object, LockOptions lockOptions) { - try (SessionResult emr = acquireSession()) { - emr.session.lock(object, lockOptions); - } - } - - @Override - public void lock(String entityName, Object object, LockMode lockMode) { - checkBlocking(); + public void lock(Object object, LockMode lockMode, LockOption... lockOptions) { try (SessionResult emr = acquireSession()) { - emr.session.lock(entityName, object, lockMode); + emr.session.lock(object, lockMode, lockOptions); } } @Override - public LockRequest buildLockRequest(LockOptions lockOptions) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - return emr.session.buildLockRequest(lockOptions); - } - } - - @Deprecated - @Override - public void refresh(String entityName, Object object) { - checkBlocking(); + public void lock(Object object, LockOptions lockOptions) { try (SessionResult emr = acquireSession()) { - emr.session.refresh(entityName, object); + emr.session.lock(object, lockOptions); } } @Override - public void refresh(Object object, LockMode lockMode) { + public void lock(Object entity, LockModeType lockMode, LockOption... options) { checkBlocking(); try (SessionResult emr = acquireSession()) { - emr.session.refresh(object, lockMode); + emr.session.lock(entity, lockMode, options); } } @@ -931,15 +863,6 @@ public void refresh(Object object, LockOptions lockOptions) { } } - @Deprecated - @Override - public void refresh(String entityName, Object object, LockOptions lockOptions) { - checkBlocking(); - try (SessionResult emr = acquireSession()) { - emr.session.refresh(entityName, object, lockOptions); - } - } - @Override public LockMode getCurrentLockMode(Object object) { checkBlocking(); @@ -1141,6 +1064,34 @@ public LobHelper getLobHelper() { } } + @Override + public Collection getManagedEntities() { + try (SessionResult emr = acquireSession()) { + return emr.session.getManagedEntities(); + } + } + + @Override + public Collection getManagedEntities(String entityName) { + try (SessionResult emr = acquireSession()) { + return emr.session.getManagedEntities(entityName); + } + } + + @Override + public Collection getManagedEntities(Class entityType) { + try (SessionResult emr = acquireSession()) { + return emr.session.getManagedEntities(entityType); + } + } + + @Override + public Collection getManagedEntities(EntityType entityType) { + try (SessionResult emr = acquireSession()) { + return emr.session.getManagedEntities(entityType); + } + } + @Override public void addEventListeners(SessionEventListener... listeners) { try (SessionResult emr = acquireSession()) { @@ -1249,6 +1200,22 @@ public T doReturningWork(ReturningWork work) throws HibernateException { } } + @Override + public void runWithConnection(ConnectionConsumer action) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + emr.session.runWithConnection(action); + } + } + + @Override + public T callWithConnection(ConnectionFunction function) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.session.callWithConnection(function); + } + } + @Deprecated @Override public NativeQuery getNamedNativeQuery(String name) { @@ -1299,42 +1266,42 @@ public SelectionQuery createSelectionQuery(CriteriaQuery criteria) { } @Override - public MutationQuery createMutationQuery(String hqlString) { + public SelectionQuery createSelectionQuery(String hqlString, EntityGraph resultGraph) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.session.createMutationQuery(hqlString); + return emr.session.createSelectionQuery(hqlString, resultGraph); } } @Override - public MutationQuery createMutationQuery(CriteriaUpdate updateQuery) { + public MutationQuery createMutationQuery(String hqlString) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.session.createMutationQuery(updateQuery); + return emr.session.createMutationQuery(hqlString); } } @Override - public MutationQuery createMutationQuery(CriteriaDelete deleteQuery) { + public MutationQuery createMutationQuery(CriteriaUpdate updateQuery) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.session.createMutationQuery(deleteQuery); + return emr.session.createMutationQuery(updateQuery); } } @Override - public MutationQuery createMutationQuery(JpaCriteriaInsertSelect insertSelect) { + public MutationQuery createMutationQuery(CriteriaDelete deleteQuery) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.session.createMutationQuery(insertSelect); + return emr.session.createMutationQuery(deleteQuery); } } @Override - public MutationQuery createMutationQuery(JpaCriteriaInsert insertSelect) { + public MutationQuery createMutationQuery(JpaCriteriaInsert insert) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.session.createMutationQuery(insertSelect); + return emr.session.createMutationQuery(insert); } } 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 6830a57e069ae..4837d322adf49 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 @@ -6,6 +6,7 @@ import jakarta.enterprise.inject.Instance; import jakarta.persistence.EntityGraph; import jakarta.persistence.TransactionRequiredException; +import jakarta.persistence.TypedQueryReference; import jakarta.persistence.criteria.CriteriaDelete; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.CriteriaUpdate; @@ -13,6 +14,7 @@ import jakarta.transaction.TransactionManager; import jakarta.transaction.TransactionSynchronizationRegistry; +import org.hibernate.CacheMode; import org.hibernate.Filter; import org.hibernate.HibernateException; import org.hibernate.LockMode; @@ -30,7 +32,6 @@ import org.hibernate.query.SelectionQuery; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.JpaCriteriaInsert; -import org.hibernate.query.criteria.JpaCriteriaInsertSelect; import io.quarkus.arc.Arc; import io.quarkus.hibernate.orm.runtime.HibernateOrmRuntimeConfig; @@ -177,6 +178,14 @@ public Query createQuery(String qlString, Class resultClass) { } } + @Override + public Query createQuery(TypedQueryReference typedQueryReference) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.statelessSession.createQuery(typedQueryReference); + } + } + @Deprecated @Override public Query createNamedQuery(String name) { @@ -289,6 +298,14 @@ public Object insert(String s, Object o) { } } + @Override + public void insertMultiple(List entities) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + emr.statelessSession.insertMultiple(entities); + } + } + @Override public boolean isOpen() { return true; @@ -325,6 +342,14 @@ public void update(String entityName, Object object) { } } + @Override + public void updateMultiple(List entities) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + emr.statelessSession.updateMultiple(entities); + } + } + @Deprecated @Override public void delete(Object object) { @@ -343,6 +368,14 @@ public void delete(String entityName, Object object) { } } + @Override + public void deleteMultiple(List entities) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + emr.statelessSession.deleteMultiple(entities); + } + } + @Deprecated @Override public void refresh(String entityName, Object object) { @@ -416,6 +449,54 @@ public Object get(String entityName, Object id, LockMode lockMode) { } } + @Override + public T get(EntityGraph graph, Object id) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.statelessSession.get(graph, id); + } + } + + @Override + public T get(EntityGraph graph, Object id, LockMode lockMode) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.statelessSession.get(graph, id, lockMode); + } + } + + @Override + public List getMultiple(Class entityClass, List ids) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.statelessSession.getMultiple(entityClass, ids); + } + } + + @Override + public List getMultiple(Class entityClass, List ids, LockMode lockMode) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.statelessSession.getMultiple(entityClass, ids, lockMode); + } + } + + @Override + public List getMultiple(EntityGraph entityGraph, List ids) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.statelessSession.getMultiple(entityGraph, ids); + } + } + + @Override + public List getMultiple(EntityGraph entityGraph, GraphSemantic graphSemantic, List ids) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.statelessSession.getMultiple(entityGraph, graphSemantic, ids); + } + } + @Override public Filter enableFilter(String filterName) { checkBlocking(); @@ -591,42 +672,42 @@ public SelectionQuery createSelectionQuery(CriteriaQuery criteria) { } @Override - public MutationQuery createMutationQuery(String hqlString) { + public SelectionQuery createSelectionQuery(String hqlString, EntityGraph resultGraph) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.statelessSession.createMutationQuery(hqlString); + return emr.statelessSession.createSelectionQuery(hqlString, resultGraph); } } @Override - public MutationQuery createMutationQuery(CriteriaUpdate updateQuery) { + public MutationQuery createMutationQuery(String hqlString) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.statelessSession.createMutationQuery(updateQuery); + return emr.statelessSession.createMutationQuery(hqlString); } } @Override - public MutationQuery createMutationQuery(CriteriaDelete deleteQuery) { + public MutationQuery createMutationQuery(CriteriaUpdate updateQuery) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.statelessSession.createMutationQuery(deleteQuery); + return emr.statelessSession.createMutationQuery(updateQuery); } } @Override - public MutationQuery createMutationQuery(JpaCriteriaInsertSelect insertSelect) { + public MutationQuery createMutationQuery(CriteriaDelete deleteQuery) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.statelessSession.createMutationQuery(insertSelect); + return emr.statelessSession.createMutationQuery(deleteQuery); } } @Override - public MutationQuery createMutationQuery(JpaCriteriaInsert insertSelect) { + public MutationQuery createMutationQuery(JpaCriteriaInsert insert) { checkBlocking(); try (SessionResult emr = acquireSession()) { - return emr.statelessSession.createMutationQuery(insertSelect); + return emr.statelessSession.createMutationQuery(insert); } } @@ -755,6 +836,14 @@ public void upsert(String entityName, Object entity) { } } + @Override + public void upsertMultiple(List entities) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + emr.statelessSession.upsertMultiple(entities); + } + } + @Override public T get(EntityGraph graph, GraphSemantic graphSemantic, Object id) { checkBlocking(); @@ -770,4 +859,20 @@ public T get(EntityGraph graph, GraphSemantic graphSemantic, Object id, L return emr.statelessSession.get(graph, graphSemantic, id, lockMode); } } + + @Override + public CacheMode getCacheMode() { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + return emr.statelessSession.getCacheMode(); + } + } + + @Override + public void setCacheMode(CacheMode cacheMode) { + checkBlocking(); + try (SessionResult emr = acquireSession()) { + emr.statelessSession.setCacheMode(cacheMode); + } + } } diff --git a/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java b/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java index da639a3535f40..dfd6098ee89de 100644 --- a/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java +++ b/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java @@ -22,7 +22,7 @@ import java.util.logging.Level; import java.util.stream.Collectors; -import jakarta.persistence.spi.PersistenceUnitTransactionType; +import jakarta.persistence.PersistenceUnitTransactionType; import org.hibernate.reactive.provider.impl.ReactiveIntegrator; import org.jboss.logging.Logger; diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/SchemaUtil.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/SchemaUtil.java index 7f05d579b83da..8b6cba116947c 100644 --- a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/SchemaUtil.java +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/SchemaUtil.java @@ -8,7 +8,6 @@ import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.mapping.SelectableConsumer; import org.hibernate.metamodel.mapping.SelectableMapping; -import org.hibernate.persister.entity.AbstractEntityPersister; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.reactive.mutiny.Mutiny; @@ -22,7 +21,7 @@ public static Set getColumnNames( MappingMetamodel metamodel) { Set result = new HashSet<>(); - AbstractEntityPersister persister = (AbstractEntityPersister) metamodel.locateEntityDescriptor(entityType); + var persister = metamodel.getEntityDescriptor(entityType); if (persister == null) { return result; } diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/config/unsupportedproperties/UnsupportedPropertiesTest.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/config/unsupportedproperties/UnsupportedPropertiesTest.java index 27e7fec4bbcb3..50471843c5cb1 100644 --- a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/config/unsupportedproperties/UnsupportedPropertiesTest.java +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/config/unsupportedproperties/UnsupportedPropertiesTest.java @@ -92,7 +92,8 @@ record -> FastBootHibernateReactivePersistenceProvider.class.getName().equals(re @Test public void testPropertiesPropagatedToStaticInit() { - assertThat(SettingsSpyingIdentifierGenerator.collectedSettings).hasSize(1); + // Two sets of settings: 0 is static init, 1 is runtime init. + assertThat(SettingsSpyingIdentifierGenerator.collectedSettings).hasSize(2); Map settings = SettingsSpyingIdentifierGenerator.collectedSettings.get(0); assertThat(settings) .containsEntry("hibernate.some.unknown.key.static-and-runtime", "some-value-1") diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java index 39c956fa3dd81..2a4449109e1fe 100644 --- a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageAnnotationTest.java @@ -66,7 +66,7 @@ public void testIncluded(UniAsserter asserter) { public void testExcluded(UniAsserter asserter) { ExcludedEntity entity = new ExcludedEntity("gsmet"); asserter.assertFailedWith(() -> persist(entity), t -> { - assertThat(t).hasMessageContaining("Unable to locate persister"); + assertThat(t).hasMessageContaining("Unknown entity type"); }); } diff --git a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java index a7ed01d0053d5..ab90348ec8c08 100644 --- a/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java +++ b/extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/singlepersistenceunit/SinglePersistenceUnitPackageConfigurationTest.java @@ -60,7 +60,7 @@ public void testIncluded(UniAsserter asserter) { public void testExcluded(UniAsserter asserter) { ExcludedEntity entity = new ExcludedEntity("gsmet"); asserter.assertFailedWith(() -> persist(entity), t -> { - assertThat(t).hasMessageContaining("Unable to locate persister:"); + assertThat(t).hasMessageContaining("Unknown entity type:"); }); } diff --git a/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/FastBootHibernateReactivePersistenceProvider.java b/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/FastBootHibernateReactivePersistenceProvider.java index 548d02eaa59c0..c1d6101cb9092 100644 --- a/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/FastBootHibernateReactivePersistenceProvider.java +++ b/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/FastBootHibernateReactivePersistenceProvider.java @@ -9,6 +9,7 @@ import java.util.Set; import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.PersistenceConfiguration; import jakarta.persistence.PersistenceException; import jakarta.persistence.spi.PersistenceProvider; import jakarta.persistence.spi.PersistenceUnitInfo; @@ -400,6 +401,13 @@ public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitI return getJdbcHibernatePersistenceProviderDelegate().createContainerEntityManagerFactory(info, map); } + @Override + public EntityManagerFactory createEntityManagerFactory(PersistenceConfiguration configuration) { + //Not supported by Hibernate Reactive: this should always delegate to Hibernate ORM, which will do its own + //checks and possibly reject if it's not a suitable. + return getJdbcHibernatePersistenceProviderDelegate().createEntityManagerFactory(configuration); + } + @Override public void generateSchema(PersistenceUnitInfo info, Map map) { getJdbcHibernatePersistenceProviderDelegate().generateSchema(info, map); diff --git a/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/boot/registry/PreconfiguredReactiveServiceRegistryBuilder.java b/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/boot/registry/PreconfiguredReactiveServiceRegistryBuilder.java index dd231b1af9c29..d5ceab7dc3636 100644 --- a/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/boot/registry/PreconfiguredReactiveServiceRegistryBuilder.java +++ b/extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/boot/registry/PreconfiguredReactiveServiceRegistryBuilder.java @@ -8,9 +8,9 @@ import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.StandardServiceInitiator; +import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.internal.BootstrapServiceRegistryImpl; import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl; -import org.hibernate.boot.registry.selector.internal.StrategySelectorImpl; import org.hibernate.engine.config.internal.ConfigurationServiceInitiator; import org.hibernate.engine.jdbc.batch.internal.BatchBuilderInitiator; import org.hibernate.engine.jdbc.connections.internal.MultiTenantConnectionProviderInitiator; @@ -22,7 +22,6 @@ import org.hibernate.persister.internal.PersisterFactoryInitiator; import org.hibernate.property.access.internal.PropertyAccessStrategyResolverInitiator; import org.hibernate.reactive.engine.jdbc.mutation.internal.ReactiveMutationExecutorServiceInitiator; -import org.hibernate.reactive.id.factory.spi.ReactiveIdentifierGeneratorFactoryInitiator; import org.hibernate.reactive.loader.ast.internal.ReactiveBatchLoaderFactoryInitiator; import org.hibernate.reactive.provider.service.NativeParametersHandling; import org.hibernate.reactive.provider.service.NoJtaPlatformInitiator; @@ -43,6 +42,7 @@ import io.quarkus.hibernate.orm.runtime.customized.QuarkusJndiServiceInitiator; import io.quarkus.hibernate.orm.runtime.customized.QuarkusRuntimeProxyFactoryFactory; import io.quarkus.hibernate.orm.runtime.customized.QuarkusRuntimeProxyFactoryFactoryInitiator; +import io.quarkus.hibernate.orm.runtime.customized.QuarkusStrategySelectorBuilder; import io.quarkus.hibernate.orm.runtime.recording.RecordedState; import io.quarkus.hibernate.orm.runtime.service.CfgXmlAccessServiceInitiatorQuarkus; import io.quarkus.hibernate.orm.runtime.service.FlatClassLoaderService; @@ -120,16 +120,18 @@ public StandardServiceRegistryImpl buildNewServiceRegistry() { } private BootstrapServiceRegistry buildEmptyBootstrapServiceRegistry() { + final ClassLoaderService providedClassLoaderService = FlatClassLoaderService.INSTANCE; // N.B. support for custom IntegratorProvider injected via Properties (as // instance) removed // N.B. support for custom StrategySelector is not implemented yet - final StrategySelectorImpl strategySelector = new StrategySelectorImpl(FlatClassLoaderService.INSTANCE); + // A non-empty selector is needed in order to support ID generators that retrieve a naming strategy -- at runtime! + var strategySelector = QuarkusStrategySelectorBuilder.buildRuntimeSelector(providedClassLoaderService); return new BootstrapServiceRegistryImpl(true, - FlatClassLoaderService.INSTANCE, + providedClassLoaderService, strategySelector, // new MirroringStrategySelector(), new MirroringIntegratorService(integrators)); } @@ -234,9 +236,6 @@ private static List> buildQuarkusServiceInitiatorLis serviceInitiators.add(EntityCopyObserverFactoryInitiator.INSTANCE); - // Custom for Hibernate Reactive: - serviceInitiators.add(ReactiveIdentifierGeneratorFactoryInitiator.INSTANCE); - //Custom for Hibernate Reactive: serviceInitiators.add(ReactiveValuesMappingProducerProviderInitiator.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 be536c8c7b278..a4691fd614457 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 @@ -16,7 +16,6 @@ import org.hibernate.event.internal.EntityCopyObserverFactoryInitiator; import org.hibernate.persister.internal.PersisterFactoryInitiator; import org.hibernate.property.access.internal.PropertyAccessStrategyResolverInitiator; -import org.hibernate.reactive.id.factory.spi.ReactiveIdentifierGeneratorFactoryInitiator; import org.hibernate.reactive.loader.ast.internal.ReactiveBatchLoaderFactoryInitiator; import org.hibernate.reactive.provider.service.NativeParametersHandling; import org.hibernate.reactive.provider.service.NoJtaPlatformInitiator; @@ -33,7 +32,6 @@ 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.QuarkusRegionFactoryInitiator; import io.quarkus.hibernate.orm.runtime.service.QuarkusStaticInitDialectFactoryInitiator; @@ -96,9 +94,6 @@ public List> initialInitiatorList() { serviceInitiators.add(JdbcServicesInitiator.INSTANCE); serviceInitiators.add(RefCursorSupportInitiator.INSTANCE); - // Custom one! - serviceInitiators.add(new QuarkusIdentifierGeneratorFactoryInitiator()); - // Custom for Hibernate Reactive: serviceInitiators.add(NoJtaPlatformInitiator.INSTANCE); @@ -113,9 +108,6 @@ public List> initialInitiatorList() { serviceInitiators.add(EntityCopyObserverFactoryInitiator.INSTANCE); - // Custom for Hibernate Reactive: - serviceInitiators.add(ReactiveIdentifierGeneratorFactoryInitiator.INSTANCE); - //Custom for Hibernate Reactive: serviceInitiators.add(ReactiveValuesMappingProducerProviderInitiator.INSTANCE); diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/deployment/HibernateSearchElasticsearchLoggingProcessor.java b/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/deployment/HibernateSearchElasticsearchLoggingProcessor.java deleted file mode 100644 index d825c26c2f6a2..0000000000000 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/deployment/HibernateSearchElasticsearchLoggingProcessor.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.quarkus.hibernate.search.orm.elasticsearch.deployment; - -import io.quarkus.deployment.annotations.BuildProducer; -import io.quarkus.deployment.annotations.BuildStep; -import io.quarkus.deployment.builditem.NativeImageFeatureBuildItem; -import io.quarkus.deployment.logging.LogCleanupFilterBuildItem; -import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild; -import io.quarkus.hibernate.search.orm.elasticsearch.runtime.graal.DisableLoggingFeature; - -// Note this is necessary even if Hibernate Search is disabled -class HibernateSearchElasticsearchLoggingProcessor { - - @BuildStep(onlyIf = NativeOrNativeSourcesBuild.class) - NativeImageFeatureBuildItem nativeImageFeature() { - return new NativeImageFeatureBuildItem(DisableLoggingFeature.class); - } - - // Note this is necessary even if Hibernate Search is disabled - @BuildStep - void setupLogFilters(BuildProducer filters) { - // if the category changes, please also update DisableLoggingFeature in the runtime module - filters.produce(new LogCleanupFilterBuildItem( - "org.hibernate.search.mapper.orm.bootstrap.impl.HibernateSearchPreIntegrationService", "HSEARCH000034")); - } - -} diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui-active-false-and-named-pu-active-true.properties b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui-active-false-and-named-pu-active-true.properties index 4c71e5b9bedfd..5814879225d17 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui-active-false-and-named-pu-active-true.properties +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui-active-false-and-named-pu-active-true.properties @@ -17,11 +17,11 @@ quarkus.hibernate-orm."namedpu".schema-management.strategy=drop-and-create # Hibernate Search is inactive for the default PU quarkus.hibernate-search-orm.active=false -quarkus.hibernate-search-orm.elasticsearch.version=8.18 +quarkus.hibernate-search-orm.elasticsearch.version=9.0 quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop # ... but it's (implicitly) active for a named PU -quarkus.hibernate-search-orm."namedpu".elasticsearch.version=8.18 +quarkus.hibernate-search-orm."namedpu".elasticsearch.version=9.0 quarkus.hibernate-search-orm."namedpu".elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm."namedpu".schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui-active-false.properties b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui-active-false.properties index bb05e4de072a2..49d9c710a1570 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui-active-false.properties +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui-active-false.properties @@ -7,6 +7,6 @@ quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1 quarkus.hibernate-orm.schema-management.strategy=drop-and-create quarkus.hibernate-search-orm.active=false -quarkus.hibernate-search-orm.elasticsearch.version=8.18 +quarkus.hibernate-search-orm.elasticsearch.version=9.0 quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui.properties b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui.properties index d1fcdbe5e2a3f..62cca1642ed43 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui.properties +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-devui.properties @@ -6,6 +6,6 @@ quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1 quarkus.hibernate-orm.schema-management.strategy=drop-and-create -quarkus.hibernate-search-orm.elasticsearch.version=8.18 +quarkus.hibernate-search-orm.elasticsearch.version=9.0 quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-multiple-persistence-units.properties b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-multiple-persistence-units.properties index 13ed905a550bc..34f6167010fd2 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-multiple-persistence-units.properties +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-multiple-persistence-units.properties @@ -13,7 +13,7 @@ quarkus.datasource.data3.jdbc.url=jdbc:h2:mem:data3;DB_CLOSE_DELAY=-1 quarkus.hibernate-orm.datasource= quarkus.hibernate-orm.schema-management.strategy=drop-and-create -quarkus.hibernate-search-orm.elasticsearch.version=8 +quarkus.hibernate-search-orm.elasticsearch.version=9 quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm.elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop @@ -22,7 +22,7 @@ quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy=sync quarkus.hibernate-orm."pu1".schema-management.strategy=drop-and-create quarkus.hibernate-orm."pu1".datasource=data1 -quarkus.hibernate-search-orm."pu1".elasticsearch.version=8 +quarkus.hibernate-search-orm."pu1".elasticsearch.version=9 quarkus.hibernate-search-orm."pu1".elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm."pu1".elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm."pu1".schema-management.strategy=drop-and-create-and-drop @@ -31,7 +31,7 @@ quarkus.hibernate-search-orm."pu1".indexing.plan.synchronization.strategy=sync quarkus.hibernate-orm."pu2".schema-management.strategy=drop-and-create quarkus.hibernate-orm."pu2".datasource=data2 -quarkus.hibernate-search-orm."pu2".elasticsearch.version=8 +quarkus.hibernate-search-orm."pu2".elasticsearch.version=9 quarkus.hibernate-search-orm."pu2".elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm."pu2".elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm."pu2".schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-start-offline.properties b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-start-offline.properties index 7878764e2186a..d3d4bbe26a303 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-start-offline.properties +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application-start-offline.properties @@ -3,7 +3,7 @@ quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1 quarkus.hibernate-orm.schema-management.strategy=drop-and-create -quarkus.hibernate-search-orm.elasticsearch.version=8.18 +quarkus.hibernate-search-orm.elasticsearch.version=9.0 # Simulate an offline Elasticsearch instance by pointing to a non-existing cluster quarkus.hibernate-search-orm.elasticsearch.hosts=localhost:14800 quarkus.hibernate-search-orm.schema-management.strategy=none diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application.properties b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application.properties index 207fdc2cb4f0d..54d0889e9a758 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application.properties +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/test/resources/application.properties @@ -3,7 +3,7 @@ quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1 quarkus.hibernate-orm.schema-management.strategy=drop-and-create -quarkus.hibernate-search-orm.elasticsearch.version=8 +quarkus.hibernate-search-orm.elasticsearch.version=9 quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm.elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/graal/DisableLoggingFeature.java b/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/graal/DisableLoggingFeature.java deleted file mode 100644 index e3666fda2aed3..0000000000000 --- a/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/graal/DisableLoggingFeature.java +++ /dev/null @@ -1,43 +0,0 @@ -package io.quarkus.hibernate.search.orm.elasticsearch.runtime.graal; - -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.graalvm.nativeimage.hosted.Feature; - -/** - * Disables logging during the analysis phase - */ -public class DisableLoggingFeature implements Feature { - - private static final String[] CATEGORIES = { - "org.hibernate.search.mapper.orm.bootstrap.impl.HibernateSearchPreIntegrationService" - }; - - private final Map categoryMap = new HashMap<>(CATEGORIES.length); - - @Override - public void beforeAnalysis(BeforeAnalysisAccess access) { - for (String category : CATEGORIES) { - Logger logger = Logger.getLogger(category); - categoryMap.put(category, logger.getLevel()); - logger.setLevel(Level.WARNING); - } - } - - @Override - public void afterAnalysis(AfterAnalysisAccess access) { - for (String category : CATEGORIES) { - Level level = categoryMap.remove(category); - Logger logger = Logger.getLogger(category); - logger.setLevel(level); - } - } - - @Override - public String getDescription() { - return "Disables INFO logging during the analysis phase"; - } -} diff --git a/extensions/hibernate-search-orm-outbox-polling/deployment/src/test/resources/application-multiple-persistence-units.properties b/extensions/hibernate-search-orm-outbox-polling/deployment/src/test/resources/application-multiple-persistence-units.properties index 9cf80a8e83e6f..2c08d69b8fa4f 100644 --- a/extensions/hibernate-search-orm-outbox-polling/deployment/src/test/resources/application-multiple-persistence-units.properties +++ b/extensions/hibernate-search-orm-outbox-polling/deployment/src/test/resources/application-multiple-persistence-units.properties @@ -7,7 +7,7 @@ quarkus.datasource.data1.jdbc.url=jdbc:h2:mem:data1;DB_CLOSE_DELAY=-1 quarkus.hibernate-orm.schema-management.strategy=drop-and-create quarkus.hibernate-orm.datasource= -quarkus.hibernate-search-orm.elasticsearch.version=8 +quarkus.hibernate-search-orm.elasticsearch.version=9 quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm.elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop @@ -16,7 +16,7 @@ quarkus.hibernate-search-orm.coordination.strategy=outbox-polling quarkus.hibernate-orm."pu1".schema-management.strategy=drop-and-create quarkus.hibernate-orm."pu1".datasource=data1 -quarkus.hibernate-search-orm."pu1".elasticsearch.version=8 +quarkus.hibernate-search-orm."pu1".elasticsearch.version=9 quarkus.hibernate-search-orm."pu1".elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm."pu1".elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm."pu1".schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/hibernate-search-orm-outbox-polling/deployment/src/test/resources/application.properties b/extensions/hibernate-search-orm-outbox-polling/deployment/src/test/resources/application.properties index d815d21852514..86300e6a83849 100644 --- a/extensions/hibernate-search-orm-outbox-polling/deployment/src/test/resources/application.properties +++ b/extensions/hibernate-search-orm-outbox-polling/deployment/src/test/resources/application.properties @@ -3,7 +3,7 @@ quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1 quarkus.hibernate-orm.schema-management.strategy=drop-and-create -quarkus.hibernate-search-orm.elasticsearch.version=8 +quarkus.hibernate-search-orm.elasticsearch.version=9 quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm.elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-devui-active-false.properties b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-devui-active-false.properties index 03cd8316cbb19..4c32db43df8e8 100644 --- a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-devui-active-false.properties +++ b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-devui-active-false.properties @@ -2,6 +2,6 @@ quarkus.devservices.enabled=false quarkus.hibernate-search-standalone.active=false -quarkus.hibernate-search-standalone.elasticsearch.version=8.18 +quarkus.hibernate-search-standalone.elasticsearch.version=9.0 quarkus.hibernate-search-standalone.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-standalone.schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-devui.properties b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-devui.properties index fd7f1cc57eb84..c1c8ec0cb7421 100644 --- a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-devui.properties +++ b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-devui.properties @@ -1,6 +1,6 @@ # We already start Elasticsearch with Maven quarkus.devservices.enabled=false -quarkus.hibernate-search-standalone.elasticsearch.version=8.18 +quarkus.hibernate-search-standalone.elasticsearch.version=9.0 quarkus.hibernate-search-standalone.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-standalone.schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-start-offline.properties b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-start-offline.properties index 425e121e938db..018dff89c4b1d 100644 --- a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-start-offline.properties +++ b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application-start-offline.properties @@ -1,4 +1,4 @@ -quarkus.hibernate-search-standalone.elasticsearch.version=8.18 +quarkus.hibernate-search-standalone.elasticsearch.version=9.0 # Simulate an offline Elasticsearch instance by pointing to a non-existing cluster quarkus.hibernate-search-standalone.elasticsearch.hosts=localhost:14800 quarkus.hibernate-search-standalone.schema-management.strategy=none diff --git a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application.properties b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application.properties index 146e1dea6f792..cd222ba38846f 100644 --- a/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application.properties +++ b/extensions/hibernate-search-standalone-elasticsearch/deployment/src/test/resources/application.properties @@ -1,4 +1,4 @@ -quarkus.hibernate-search-standalone.elasticsearch.version=8 +quarkus.hibernate-search-standalone.elasticsearch.version=9 quarkus.hibernate-search-standalone.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-standalone.elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-standalone.schema-management.strategy=drop-and-create-and-drop diff --git a/extensions/panache/hibernate-orm-panache-kotlin/runtime/pom.xml b/extensions/panache/hibernate-orm-panache-kotlin/runtime/pom.xml index 466e953432d4e..fab0ef27078b0 100644 --- a/extensions/panache/hibernate-orm-panache-kotlin/runtime/pom.xml +++ b/extensions/panache/hibernate-orm-panache-kotlin/runtime/pom.xml @@ -109,12 +109,12 @@ org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor ${hibernate-orm.version} - org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + org.hibernate.processor.HibernateProcessor diff --git a/extensions/panache/hibernate-orm-panache/runtime/pom.xml b/extensions/panache/hibernate-orm-panache/runtime/pom.xml index 9fca077cf498f..54b0d96bc2f23 100644 --- a/extensions/panache/hibernate-orm-panache/runtime/pom.xml +++ b/extensions/panache/hibernate-orm-panache/runtime/pom.xml @@ -58,11 +58,11 @@ org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor - org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + org.hibernate.processor.HibernateProcessor diff --git a/extensions/panache/hibernate-reactive-panache-common/runtime/src/main/java/io/quarkus/hibernate/reactive/panache/common/runtime/CommonPanacheQueryImpl.java b/extensions/panache/hibernate-reactive-panache-common/runtime/src/main/java/io/quarkus/hibernate/reactive/panache/common/runtime/CommonPanacheQueryImpl.java index 1c1e779a9cd71..cdc2a180fdefa 100644 --- a/extensions/panache/hibernate-reactive-panache-common/runtime/src/main/java/io/quarkus/hibernate/reactive/panache/common/runtime/CommonPanacheQueryImpl.java +++ b/extensions/panache/hibernate-reactive-panache-common/runtime/src/main/java/io/quarkus/hibernate/reactive/panache/common/runtime/CommonPanacheQueryImpl.java @@ -376,7 +376,8 @@ private Mutiny.SelectionQuery createBaseQuery(Mutiny.Session em) { Mutiny.SelectionQuery hibernateQuery; if (PanacheJpaUtil.isNamedQuery(query)) { String namedQuery = query.substring(1); - hibernateQuery = em.createNamedQuery(namedQuery, projectionType); + hibernateQuery = projectionType == null ? em.createNamedQuery(namedQuery) + : em.createNamedQuery(namedQuery, projectionType); } else { try { hibernateQuery = em.createSelectionQuery(orderBy != null ? query + orderBy : query, projectionType); diff --git a/extensions/panache/hibernate-reactive-panache-kotlin/runtime/pom.xml b/extensions/panache/hibernate-reactive-panache-kotlin/runtime/pom.xml index e007a8da611b8..9e1e07216c34f 100644 --- a/extensions/panache/hibernate-reactive-panache-kotlin/runtime/pom.xml +++ b/extensions/panache/hibernate-reactive-panache-kotlin/runtime/pom.xml @@ -118,12 +118,12 @@ org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor ${hibernate-orm.version} - org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + org.hibernate.processor.HibernateProcessor diff --git a/extensions/panache/hibernate-reactive-panache/runtime/pom.xml b/extensions/panache/hibernate-reactive-panache/runtime/pom.xml index e13e33af64fbc..94f0cd6c6600d 100644 --- a/extensions/panache/hibernate-reactive-panache/runtime/pom.xml +++ b/extensions/panache/hibernate-reactive-panache/runtime/pom.xml @@ -62,11 +62,11 @@ org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor - org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + org.hibernate.processor.HibernateProcessor diff --git a/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/CountParserVisitor.java b/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/CountParserVisitor.java deleted file mode 100644 index 8e7f94fcc5014..0000000000000 --- a/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/CountParserVisitor.java +++ /dev/null @@ -1,107 +0,0 @@ -package io.quarkus.panache.hibernate.common.runtime; - -import org.antlr.v4.runtime.tree.TerminalNode; -import org.hibernate.grammars.hql.HqlParser.JoinContext; -import org.hibernate.grammars.hql.HqlParser.QueryContext; -import org.hibernate.grammars.hql.HqlParser.QueryOrderContext; -import org.hibernate.grammars.hql.HqlParser.SelectClauseContext; -import org.hibernate.grammars.hql.HqlParser.SimpleQueryGroupContext; -import org.hibernate.grammars.hql.HqlParserBaseVisitor; - -public class CountParserVisitor extends HqlParserBaseVisitor { - - private int inSimpleQueryGroup; - private StringBuilder sb = new StringBuilder(); - - @Override - public String visitSimpleQueryGroup(SimpleQueryGroupContext ctx) { - inSimpleQueryGroup++; - try { - return super.visitSimpleQueryGroup(ctx); - } finally { - inSimpleQueryGroup--; - } - } - - @Override - public String visitQuery(QueryContext ctx) { - super.visitQuery(ctx); - if (inSimpleQueryGroup == 1 && ctx.selectClause() == null) { - // insert a count because there's no select - sb.append(" select count( * )"); - } - return null; - } - - @Override - public String visitSelectClause(SelectClauseContext ctx) { - if (inSimpleQueryGroup == 1) { - if (ctx.SELECT() != null) { - ctx.SELECT().accept(this); - } - if (ctx.DISTINCT() != null) { - sb.append(" count("); - ctx.DISTINCT().accept(this); - if (ctx.selectionList().children.size() != 1) { - throw new RequiresSubqueryException(); - } - ctx.selectionList().children.get(0).accept(this); - sb.append(" )"); - } else { - sb.append(" count( * )"); - } - } else { - super.visitSelectClause(ctx); - } - return null; - } - - @Override - public String visitJoin(JoinContext ctx) { - if (inSimpleQueryGroup == 1 && ctx.FETCH() != null) { - // ignore fetch joins for main query - return null; - } - return super.visitJoin(ctx); - } - - @Override - public String visitQueryOrder(QueryOrderContext ctx) { - if (inSimpleQueryGroup == 1) { - // ignore order/limit/offset for main query - return null; - } - return super.visitQueryOrder(ctx); - } - - @Override - public String visitTerminal(TerminalNode node) { - append(node.getText()); - return null; - } - - @Override - protected String defaultResult() { - return null; - } - - @Override - protected String aggregateResult(String aggregate, String nextResult) { - if (nextResult != null) { - append(nextResult); - } - return null; - } - - private void append(String nextResult) { - // don't add space at start, or around dots - if (!sb.isEmpty() && sb.charAt(sb.length() - 1) != '.' && !nextResult.equals(".")) { - sb.append(" "); - } - sb.append(nextResult); - } - - public String result() { - return sb.toString(); - } -} \ No newline at end of file diff --git a/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/PanacheJpaUtil.java b/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/PanacheJpaUtil.java index c89c0953c4d4d..b2e6d533d9126 100644 --- a/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/PanacheJpaUtil.java +++ b/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/PanacheJpaUtil.java @@ -17,18 +17,6 @@ public class PanacheJpaUtil { static final Pattern FROM_PATTERN = Pattern.compile("^\\s*FROM\\s+.*", Pattern.CASE_INSENSITIVE | Pattern.DOTALL); - // match a FETCH - static final Pattern FETCH_PATTERN = Pattern.compile(".*\\s+FETCH\\s+.*", - Pattern.CASE_INSENSITIVE | Pattern.DOTALL); - - // match a lone SELECT - static final Pattern LONE_SELECT_PATTERN = Pattern.compile(".*SELECT\\s+.*", - Pattern.CASE_INSENSITIVE | Pattern.DOTALL); - - // match a leading WITH - static final Pattern WITH_PATTERN = Pattern.compile("^\\s*WITH\\s+.*", - Pattern.CASE_INSENSITIVE | Pattern.DOTALL); - public static String getEntityName(Class entityClass) { // FIXME: not true? // Escape the entity name just in case some keywords are used diff --git a/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/RequiresSubqueryException.java b/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/RequiresSubqueryException.java deleted file mode 100644 index 56fe981344cc0..0000000000000 --- a/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/RequiresSubqueryException.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.quarkus.panache.hibernate.common.runtime; - -public class RequiresSubqueryException extends RuntimeException { - -} diff --git a/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/SubQueryAliasParserVisitor.java b/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/SubQueryAliasParserVisitor.java deleted file mode 100644 index 7e4351e85568c..0000000000000 --- a/extensions/panache/panache-hibernate-common/runtime/src/main/java/io/quarkus/panache/hibernate/common/runtime/SubQueryAliasParserVisitor.java +++ /dev/null @@ -1,85 +0,0 @@ -package io.quarkus.panache.hibernate.common.runtime; - -import org.antlr.v4.runtime.tree.TerminalNode; -import org.hibernate.grammars.hql.HqlParser.JoinContext; -import org.hibernate.grammars.hql.HqlParser.QueryOrderContext; -import org.hibernate.grammars.hql.HqlParser.SelectionContext; -import org.hibernate.grammars.hql.HqlParser.SimpleQueryGroupContext; -import org.hibernate.grammars.hql.HqlParserBaseVisitor; - -public class SubQueryAliasParserVisitor extends HqlParserBaseVisitor { - - private int inSimpleQueryGroup; - private StringBuilder sb = new StringBuilder(); - private int counter; - - @Override - public String visitSimpleQueryGroup(SimpleQueryGroupContext ctx) { - inSimpleQueryGroup++; - try { - return super.visitSimpleQueryGroup(ctx); - } finally { - inSimpleQueryGroup--; - } - } - - @Override - public String visitSelection(SelectionContext ctx) { - super.visitSelection(ctx); - if (inSimpleQueryGroup == 1) { - if (ctx.variable() == null) { - sb.append(" as __v" + counter++); - } - } - return null; - } - - @Override - public String visitJoin(JoinContext ctx) { - if (inSimpleQueryGroup == 1 && ctx.FETCH() != null) { - // ignore fetch joins for main query - return null; - } - return super.visitJoin(ctx); - } - - @Override - public String visitQueryOrder(QueryOrderContext ctx) { - if (inSimpleQueryGroup == 1) { - // ignore order/limit/offset for main query - return null; - } - return super.visitQueryOrder(ctx); - } - - @Override - public String visitTerminal(TerminalNode node) { - append(node.getText()); - return null; - } - - @Override - protected String defaultResult() { - return null; - } - - @Override - protected String aggregateResult(String aggregate, String nextResult) { - if (nextResult != null) { - append(nextResult); - } - return null; - } - - private void append(String nextResult) { - // don't add space at start, or around dots, commas - if (!sb.isEmpty() && sb.charAt(sb.length() - 1) != '.' && !nextResult.equals(".") && !nextResult.equals(",")) { - sb.append(" "); - } - sb.append(nextResult); - } - - public String result() { - return sb.toString(); - } -} \ No newline at end of file diff --git a/extensions/pom.xml b/extensions/pom.xml index 99b37b0e58231..772cb6b63fe78 100644 --- a/extensions/pom.xml +++ b/extensions/pom.xml @@ -96,6 +96,7 @@ agroal jdbc hibernate-orm + hibernate-orm-derby hibernate-envers hibernate-reactive hibernate-validator diff --git a/extensions/spring-data-jpa/deployment/src/test/resources/import_customers.sql b/extensions/spring-data-jpa/deployment/src/test/resources/import_customers.sql index 3c41b423f707d..a343c364d1e77 100644 --- a/extensions/spring-data-jpa/deployment/src/test/resources/import_customers.sql +++ b/extensions/spring-data-jpa/deployment/src/test/resources/import_customers.sql @@ -1,11 +1,11 @@ -INSERT INTO "Customer$Country" (id, name, isocode) +INSERT INTO Customer$Country (id, name, isocode) VALUES (1, 'United States', 'US'), (2, 'France', 'FR'), (3, 'Germany', 'DE'), (4, 'Spain', 'ES'); -INSERT INTO "Customer$Address" (id, zipcode, country_id) +INSERT INTO Customer$Address (id, zipcode, country_id) VALUES (1, '10001', 1), -- US address (2, '75001', 2), -- French address diff --git a/integration-tests/gradle/src/main/resources/compile-only-lombok/build.gradle b/integration-tests/gradle/src/main/resources/compile-only-lombok/build.gradle index 907d95c748e97..74b841226d7be 100644 --- a/integration-tests/gradle/src/main/resources/compile-only-lombok/build.gradle +++ b/integration-tests/gradle/src/main/resources/compile-only-lombok/build.gradle @@ -22,9 +22,9 @@ dependencies { testCompileOnly "org.projectlombok:lombok:${lombokVersion}" testAnnotationProcessor "org.projectlombok:lombok:${lombokVersion}" - compileOnly "org.hibernate.orm:hibernate-jpamodelgen" + compileOnly "org.hibernate.orm:hibernate-processor" compileOnly enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}") - annotationProcessor "org.hibernate.orm:hibernate-jpamodelgen" + annotationProcessor "org.hibernate.orm:hibernate-processor" annotationProcessor enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}") testImplementation 'io.quarkus:quarkus-junit5' @@ -45,4 +45,4 @@ compileTestJava { test { systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager" -} \ No newline at end of file +} diff --git a/integration-tests/hibernate-orm-data/pom.xml b/integration-tests/hibernate-orm-data/pom.xml index 66d2437bc6c98..c5e78c63740cc 100644 --- a/integration-tests/hibernate-orm-data/pom.xml +++ b/integration-tests/hibernate-orm-data/pom.xml @@ -136,9 +136,12 @@ org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor + + org.hibernate.processor.HibernateProcessor + diff --git a/integration-tests/hibernate-orm-jpamodelgen/pom.xml b/integration-tests/hibernate-orm-jpamodelgen/pom.xml index ea49353433e4b..6385cca16c66a 100644 --- a/integration-tests/hibernate-orm-jpamodelgen/pom.xml +++ b/integration-tests/hibernate-orm-jpamodelgen/pom.xml @@ -149,9 +149,12 @@ org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor + + org.hibernate.processor.HibernateProcessor + diff --git a/integration-tests/hibernate-orm-panache/src/main/java/io/quarkus/it/panache/defaultpu/TestEndpoint.java b/integration-tests/hibernate-orm-panache/src/main/java/io/quarkus/it/panache/defaultpu/TestEndpoint.java index 440aa962ac3f0..ed00b7994a1ca 100644 --- a/integration-tests/hibernate-orm-panache/src/main/java/io/quarkus/it/panache/defaultpu/TestEndpoint.java +++ b/integration-tests/hibernate-orm-panache/src/main/java/io/quarkus/it/panache/defaultpu/TestEndpoint.java @@ -1819,7 +1819,10 @@ public String testEnhancement27184DeleteDetached() { @Transactional public String testBug26308() { testBug26308Query("from Person2 p left join fetch p.address"); - testBug26308Query("from Person2 p left join p.address"); + // This cannot work, see https://docs.jboss.org/hibernate/orm/7.0/migration-guide/migration-guide.html#create-query + //testBug26308Query("from Person2 p left join p.address"); + // This must be used instead: + testBug26308Query("from Person2 this left join this.address"); testBug26308Query("select p from Person2 p left join fetch p.address"); testBug26308Query("select p from Person2 p left join p.address"); testBug26308Query("from Person2 p left join fetch p.address select p"); diff --git a/integration-tests/hibernate-orm-panache/src/test/java/io/quarkus/it/panache/defaultpu/PanacheMockingTest.java b/integration-tests/hibernate-orm-panache/src/test/java/io/quarkus/it/panache/defaultpu/PanacheMockingTest.java index 46ef68e1ba5a9..5151162d2cba9 100644 --- a/integration-tests/hibernate-orm-panache/src/test/java/io/quarkus/it/panache/defaultpu/PanacheMockingTest.java +++ b/integration-tests/hibernate-orm-panache/src/test/java/io/quarkus/it/panache/defaultpu/PanacheMockingTest.java @@ -30,7 +30,7 @@ public class PanacheMockingTest { public void setup() { SelectionQuery mockQuery = Mockito.mock(SelectionQuery.class); Mockito.doNothing().when(session).persist(Mockito.any()); - Mockito.when(session.createSelectionQuery(Mockito.anyString(), Mockito.any())).thenReturn(mockQuery); + Mockito.when(session.createSelectionQuery(Mockito.anyString(), Mockito.> any())).thenReturn(mockQuery); Mockito.when(mockQuery.getSingleResult()).thenReturn(0l); } diff --git a/integration-tests/hibernate-reactive-panache/src/main/java/io/quarkus/it/panache/reactive/TestEndpoint.java b/integration-tests/hibernate-reactive-panache/src/main/java/io/quarkus/it/panache/reactive/TestEndpoint.java index 42fc452618fda..2a8b20d5ca44a 100644 --- a/integration-tests/hibernate-reactive-panache/src/main/java/io/quarkus/it/panache/reactive/TestEndpoint.java +++ b/integration-tests/hibernate-reactive-panache/src/main/java/io/quarkus/it/panache/reactive/TestEndpoint.java @@ -2076,7 +2076,10 @@ public Uni testSortByNullPrecedence() { @WithTransaction public Uni testBug26308() { return testBug26308Query("from Person2 p left join fetch p.address") - .flatMap(p -> testBug26308Query("from Person2 p left join p.address")) + // This cannot work, see https://docs.jboss.org/hibernate/orm/7.0/migration-guide/migration-guide.html#create-query + //.flatMap(p -> testBug26308Query("from Person2 p left join p.address")) + // This must be used instead: + .flatMap(p -> testBug26308Query("from Person2 this left join this.address")) .flatMap(p -> testBug26308Query("select p from Person2 p left join fetch p.address")) .flatMap(p -> testBug26308Query("select p from Person2 p left join p.address")) .flatMap(p -> testBug26308Query("from Person2 p left join fetch p.address select p")) diff --git a/integration-tests/hibernate-search-orm-elasticsearch-outbox-polling/src/main/java/io/quarkus/it/hibernate/search/orm/elasticsearch/coordination/outboxpolling/OutboxPollingTestUtils.java b/integration-tests/hibernate-search-orm-elasticsearch-outbox-polling/src/main/java/io/quarkus/it/hibernate/search/orm/elasticsearch/coordination/outboxpolling/OutboxPollingTestUtils.java index 9791044473929..58ebe6c4672e8 100644 --- a/integration-tests/hibernate-search-orm-elasticsearch-outbox-polling/src/main/java/io/quarkus/it/hibernate/search/orm/elasticsearch/coordination/outboxpolling/OutboxPollingTestUtils.java +++ b/integration-tests/hibernate-search-orm-elasticsearch-outbox-polling/src/main/java/io/quarkus/it/hibernate/search/orm/elasticsearch/coordination/outboxpolling/OutboxPollingTestUtils.java @@ -16,9 +16,9 @@ import org.hibernate.search.mapper.orm.outboxpolling.cluster.impl.Agent; import org.hibernate.search.mapper.orm.outboxpolling.cluster.impl.AgentState; -import org.hibernate.search.mapper.orm.outboxpolling.cluster.impl.OutboxPollingAgentAdditionalJaxbMappingProducer; +import org.hibernate.search.mapper.orm.outboxpolling.cluster.impl.OutboxPollingAgentAdditionalMappingProducer; import org.hibernate.search.mapper.orm.outboxpolling.event.impl.OutboxEvent; -import org.hibernate.search.mapper.orm.outboxpolling.event.impl.OutboxPollingOutboxEventAdditionalJaxbMappingProducer; +import org.hibernate.search.mapper.orm.outboxpolling.event.impl.OutboxPollingOutboxEventAdditionalMappingProducer; public class OutboxPollingTestUtils { @@ -50,7 +50,7 @@ public static void awaitAgentsRunning(EntityManager entityManager, UserTransacti .atMost(Duration.ofSeconds(10)) // CI can be rather slow... .untilAsserted(() -> inTransaction(userTransaction, () -> { List agents = entityManager - .createQuery("select a from " + OutboxPollingAgentAdditionalJaxbMappingProducer.ENTITY_NAME + .createQuery("select a from " + OutboxPollingAgentAdditionalMappingProducer.ENTITY_NAME + " a order by a.id", Agent.class) .getResultList(); assertThat(agents) @@ -69,7 +69,7 @@ public static void awaitNoMoreOutboxEvents(EntityManager entityManager, UserTran .atMost(Duration.ofSeconds(20)) // CI can be rather slow... .untilAsserted(() -> inTransaction(userTransaction, () -> { List events = entityManager - .createQuery("select e from " + OutboxPollingOutboxEventAdditionalJaxbMappingProducer.ENTITY_NAME + .createQuery("select e from " + OutboxPollingOutboxEventAdditionalMappingProducer.ENTITY_NAME + " e order by e.id", OutboxEvent.class) .getResultList(); assertThat(events).isEmpty(); diff --git a/integration-tests/hibernate-search-orm-elasticsearch-outbox-polling/src/main/resources/application.properties b/integration-tests/hibernate-search-orm-elasticsearch-outbox-polling/src/main/resources/application.properties index 1a3d1932ea644..40e99985d8a6f 100644 --- a/integration-tests/hibernate-search-orm-elasticsearch-outbox-polling/src/main/resources/application.properties +++ b/integration-tests/hibernate-search-orm-elasticsearch-outbox-polling/src/main/resources/application.properties @@ -6,7 +6,7 @@ quarkus.datasource.jdbc.max-size=8 quarkus.hibernate-orm.schema-management.strategy=drop-and-create -quarkus.hibernate-search-orm.elasticsearch.version=8 +quarkus.hibernate-search-orm.elasticsearch.version=9 quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm.elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop diff --git a/integration-tests/hibernate-search-orm-elasticsearch-tenancy/src/main/resources/application.properties b/integration-tests/hibernate-search-orm-elasticsearch-tenancy/src/main/resources/application.properties index 4aca47a9d64ab..78760c34531ee 100644 --- a/integration-tests/hibernate-search-orm-elasticsearch-tenancy/src/main/resources/application.properties +++ b/integration-tests/hibernate-search-orm-elasticsearch-tenancy/src/main/resources/application.properties @@ -7,7 +7,7 @@ quarkus.hibernate-orm.schema-management.strategy=none quarkus.hibernate-orm.multitenant=schema quarkus.hibernate-orm.packages=io.quarkus.it.hibernate.search.orm.elasticsearch.multitenancy.fruit -quarkus.hibernate-search-orm.elasticsearch.version=8 +quarkus.hibernate-search-orm.elasticsearch.version=9 quarkus.hibernate-search-orm.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm.elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop @@ -19,8 +19,8 @@ quarkus.hibernate-orm."books".schema-management.strategy=none quarkus.hibernate-orm."books".multitenant=schema quarkus.hibernate-orm."books".packages=io.quarkus.it.hibernate.search.orm.elasticsearch.multitenancy.book -quarkus.hibernate-search-orm."books".elasticsearch.version=8 +quarkus.hibernate-search-orm."books".elasticsearch.version=9 quarkus.hibernate-search-orm."books".elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} quarkus.hibernate-search-orm."books".elasticsearch.protocol=${elasticsearch.protocol:http} quarkus.hibernate-search-orm."books".schema-management.strategy=drop-and-create-and-drop -quarkus.hibernate-search-orm."books".indexing.plan.synchronization.strategy=sync \ No newline at end of file +quarkus.hibernate-search-orm."books".indexing.plan.synchronization.strategy=sync diff --git a/integration-tests/hibernate-search-orm-elasticsearch/src/main/resources/application.properties b/integration-tests/hibernate-search-orm-elasticsearch/src/main/resources/application.properties index 55e8313f7722c..7666bb0b9d8cb 100644 --- a/integration-tests/hibernate-search-orm-elasticsearch/src/main/resources/application.properties +++ b/integration-tests/hibernate-search-orm-elasticsearch/src/main/resources/application.properties @@ -6,7 +6,7 @@ quarkus.datasource.jdbc.max-size=8 quarkus.hibernate-orm.schema-management.strategy=drop-and-create quarkus.hibernate-search-orm.mapping.configurer=bean:custom-dependent-bean-mapping-configurer,class:io.quarkus.it.hibernate.search.orm.elasticsearch.mapping.CustomClassMappingConfigurer,bean:custom-application-bean-mapping-configurer -quarkus.hibernate-search-orm.elasticsearch.version=8 +quarkus.hibernate-search-orm.elasticsearch.version=9 quarkus.hibernate-search-orm.elasticsearch.analysis.configurer=bean:backend-analysis quarkus.hibernate-search-orm.elasticsearch.indexes.Analysis1TestingEntity.analysis.configurer=class:io.quarkus.it.hibernate.search.orm.elasticsearch.analysis.IndexAnalysis1Configurer quarkus.hibernate-search-orm.elasticsearch.indexes.Analysis2TestingEntity.analysis.configurer=bean:index-analysis-2 diff --git a/integration-tests/hibernate-search-orm-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/orm/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledExplicitlyTest.java b/integration-tests/hibernate-search-orm-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/orm/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledExplicitlyTest.java index 86a17a4c8b7b6..9f4a906150e30 100644 --- a/integration-tests/hibernate-search-orm-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/orm/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledExplicitlyTest.java +++ b/integration-tests/hibernate-search-orm-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/orm/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledExplicitlyTest.java @@ -37,7 +37,7 @@ public Map getConfigOverrides() { // But here it doesn't matter as we won't send a request to Elasticsearch anyway, // so we're free to put anything. // Just make sure to set something consistent with what we have in application.properties. - "quarkus.hibernate-search-orm.elasticsearch.version", "8.18")); + "quarkus.hibernate-search-orm.elasticsearch.version", "9.0")); return config; } diff --git a/integration-tests/hibernate-search-orm-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/orm/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledImplicitlyTest.java b/integration-tests/hibernate-search-orm-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/orm/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledImplicitlyTest.java index 807b2295a87ad..58e7751c9754e 100644 --- a/integration-tests/hibernate-search-orm-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/orm/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledImplicitlyTest.java +++ b/integration-tests/hibernate-search-orm-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/orm/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledImplicitlyTest.java @@ -36,7 +36,7 @@ public Map getConfigOverrides() { // But here it doesn't matter as we won't send a request to Elasticsearch anyway, // so we're free to put anything. // Just make sure to set something consistent with what we have in application.properties. - "quarkus.hibernate-search-orm.elasticsearch.version", "8.18"); + "quarkus.hibernate-search-orm.elasticsearch.version", "9.0"); } @Override diff --git a/integration-tests/hibernate-search-orm-opensearch/src/main/resources/application.properties b/integration-tests/hibernate-search-orm-opensearch/src/main/resources/application.properties index 036abdc72d53e..0cfbc818959c8 100644 --- a/integration-tests/hibernate-search-orm-opensearch/src/main/resources/application.properties +++ b/integration-tests/hibernate-search-orm-opensearch/src/main/resources/application.properties @@ -6,7 +6,7 @@ quarkus.datasource.jdbc.max-size=8 quarkus.hibernate-orm.schema-management.strategy=drop-and-create -quarkus.hibernate-search-orm.elasticsearch.version=opensearch:2 +quarkus.hibernate-search-orm.elasticsearch.version=opensearch:3 quarkus.hibernate-search-orm.elasticsearch.analysis.configurer=bean:backend-analysis quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create-and-drop quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy=sync @@ -17,4 +17,4 @@ quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy=sync # See io.quarkus.it.hibernate.search.orm.opensearch.devservices.HibernateSearchOpenSearchDevServicesEnabledImplicitlyTest.testHibernateSearch %test.quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create %test.quarkus.hibernate-search-orm.elasticsearch.hosts=${opensearch.hosts:localhost:9200} -%test.quarkus.hibernate-search-orm.elasticsearch.protocol=${opensearch.protocol:http} \ No newline at end of file +%test.quarkus.hibernate-search-orm.elasticsearch.protocol=${opensearch.protocol:http} diff --git a/integration-tests/hibernate-search-orm-opensearch/src/test/java/io/quarkus/it/hibernate/search/orm/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledExplicitlyTest.java b/integration-tests/hibernate-search-orm-opensearch/src/test/java/io/quarkus/it/hibernate/search/orm/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledExplicitlyTest.java index 2aadb26c771ad..225873e6c30b6 100644 --- a/integration-tests/hibernate-search-orm-opensearch/src/test/java/io/quarkus/it/hibernate/search/orm/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledExplicitlyTest.java +++ b/integration-tests/hibernate-search-orm-opensearch/src/test/java/io/quarkus/it/hibernate/search/orm/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledExplicitlyTest.java @@ -37,7 +37,7 @@ public Map getConfigOverrides() { // But here it doesn't matter as we won't send a request to OpenSearch anyway, // so we're free to put anything. // Just make sure to set something consistent with what we have in application.properties. - "quarkus.hibernate-search-orm.elasticsearch.version", "opensearch:2.16")); + "quarkus.hibernate-search-orm.elasticsearch.version", "opensearch:3.0")); return config; } diff --git a/integration-tests/hibernate-search-orm-opensearch/src/test/java/io/quarkus/it/hibernate/search/orm/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledImplicitlyTest.java b/integration-tests/hibernate-search-orm-opensearch/src/test/java/io/quarkus/it/hibernate/search/orm/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledImplicitlyTest.java index 80163bbff07e1..858ef8c089ee2 100644 --- a/integration-tests/hibernate-search-orm-opensearch/src/test/java/io/quarkus/it/hibernate/search/orm/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledImplicitlyTest.java +++ b/integration-tests/hibernate-search-orm-opensearch/src/test/java/io/quarkus/it/hibernate/search/orm/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledImplicitlyTest.java @@ -36,7 +36,7 @@ public Map getConfigOverrides() { // But here it doesn't matter as we won't send a request to OpenSearch anyway, // so we're free to put anything. // Just make sure to set something consistent with what we have in application.properties. - "quarkus.hibernate-search-orm.elasticsearch.version", "opensearch:2.16"); + "quarkus.hibernate-search-orm.elasticsearch.version", "opensearch:3.0"); } @Override diff --git a/integration-tests/hibernate-search-standalone-elasticsearch/src/main/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/search/MyMassLoadingStrategy.java b/integration-tests/hibernate-search-standalone-elasticsearch/src/main/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/search/MyMassLoadingStrategy.java index a3494e5eda0b3..4de5d8dc95f93 100644 --- a/integration-tests/hibernate-search-standalone-elasticsearch/src/main/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/search/MyMassLoadingStrategy.java +++ b/integration-tests/hibernate-search-standalone-elasticsearch/src/main/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/search/MyMassLoadingStrategy.java @@ -8,6 +8,7 @@ import java.util.Collection; import java.util.List; +import java.util.OptionalLong; import org.hibernate.search.mapper.pojo.standalone.loading.LoadingTypeGroup; import org.hibernate.search.mapper.pojo.standalone.loading.MassEntityLoader; @@ -49,8 +50,8 @@ public void close() { } @Override - public long totalCount() { - return connection.countEntities(typeFilter); + public OptionalLong totalCount() { + return OptionalLong.of(connection.countEntities(typeFilter)); } @Override diff --git a/integration-tests/hibernate-search-standalone-elasticsearch/src/main/resources/application.properties b/integration-tests/hibernate-search-standalone-elasticsearch/src/main/resources/application.properties index df37b5c1288f0..3264612f01afa 100644 --- a/integration-tests/hibernate-search-standalone-elasticsearch/src/main/resources/application.properties +++ b/integration-tests/hibernate-search-standalone-elasticsearch/src/main/resources/application.properties @@ -1,6 +1,6 @@ quarkus.ssl.native = false -quarkus.hibernate-search-standalone.elasticsearch.version=8 +quarkus.hibernate-search-standalone.elasticsearch.version=9 quarkus.hibernate-search-standalone.indexing.plan.synchronization.strategy=sync quarkus.hibernate-search-standalone.schema-management.strategy=drop-and-create-and-drop @@ -11,4 +11,4 @@ quarkus.hibernate-search-standalone.schema-management.strategy=drop-and-create-a # we want to enable management so that we can access Hibernate Search management endpoints: quarkus.management.enabled=true # now enable the Hibernate Search management itself: -quarkus.hibernate-search-standalone.management.enabled=true \ No newline at end of file +quarkus.hibernate-search-standalone.management.enabled=true diff --git a/integration-tests/hibernate-search-standalone-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledExplicitlyTest.java b/integration-tests/hibernate-search-standalone-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledExplicitlyTest.java index 08dca1b15f5c6..59f21e1be3a97 100644 --- a/integration-tests/hibernate-search-standalone-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledExplicitlyTest.java +++ b/integration-tests/hibernate-search-standalone-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledExplicitlyTest.java @@ -37,7 +37,7 @@ public Map getConfigOverrides() { // But here it doesn't matter as we won't send a request to Elasticsearch anyway, // so we're free to put anything. // Just make sure to set something consistent with what we have in application.properties. - "quarkus.hibernate-search-standalone.elasticsearch.version", "8.18")); + "quarkus.hibernate-search-standalone.elasticsearch.version", "9.0")); return config; } diff --git a/integration-tests/hibernate-search-standalone-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledImplicitlyTest.java b/integration-tests/hibernate-search-standalone-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledImplicitlyTest.java index 91a2d0940e430..7081b36a62a1f 100644 --- a/integration-tests/hibernate-search-standalone-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledImplicitlyTest.java +++ b/integration-tests/hibernate-search-standalone-elasticsearch/src/test/java/io/quarkus/it/hibernate/search/standalone/elasticsearch/devservices/HibernateSearchElasticsearchDevServicesDisabledImplicitlyTest.java @@ -36,7 +36,7 @@ public Map getConfigOverrides() { // But here it doesn't matter as we won't send a request to Elasticsearch anyway, // so we're free to put anything. // Just make sure to set something consistent with what we have in application.properties. - "quarkus.hibernate-search-standalone.elasticsearch.version", "8.18"); + "quarkus.hibernate-search-standalone.elasticsearch.version", "9.0"); } @Override diff --git a/integration-tests/hibernate-search-standalone-opensearch/src/main/resources/application.properties b/integration-tests/hibernate-search-standalone-opensearch/src/main/resources/application.properties index cfa6d154f6234..729c7c489d33b 100644 --- a/integration-tests/hibernate-search-standalone-opensearch/src/main/resources/application.properties +++ b/integration-tests/hibernate-search-standalone-opensearch/src/main/resources/application.properties @@ -1,8 +1,8 @@ quarkus.ssl.native = false -quarkus.hibernate-search-standalone.elasticsearch.version=opensearch:2 +quarkus.hibernate-search-standalone.elasticsearch.version=opensearch:3 quarkus.hibernate-search-standalone.indexing.plan.synchronization.strategy=sync %test.quarkus.hibernate-search-standalone.schema-management.strategy=drop-and-create-and-drop %test.quarkus.hibernate-search-standalone.elasticsearch.hosts=${elasticsearch.hosts:localhost:9200} -%test.quarkus.hibernate-search-standalone.elasticsearch.protocol=${elasticsearch.protocol:http} \ No newline at end of file +%test.quarkus.hibernate-search-standalone.elasticsearch.protocol=${elasticsearch.protocol:http} diff --git a/integration-tests/hibernate-search-standalone-opensearch/src/test/java/io/quarkus/it/hibernate/search/standalone/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledExplicitlyTest.java b/integration-tests/hibernate-search-standalone-opensearch/src/test/java/io/quarkus/it/hibernate/search/standalone/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledExplicitlyTest.java index a794bb91c0cdc..5cb8f8a3e3d24 100644 --- a/integration-tests/hibernate-search-standalone-opensearch/src/test/java/io/quarkus/it/hibernate/search/standalone/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledExplicitlyTest.java +++ b/integration-tests/hibernate-search-standalone-opensearch/src/test/java/io/quarkus/it/hibernate/search/standalone/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledExplicitlyTest.java @@ -37,7 +37,7 @@ public Map getConfigOverrides() { // But here it doesn't matter as we won't send a request to OpenSearch anyway, // so we're free to put anything. // Just make sure to set something consistent with what we have in application.properties. - "quarkus.hibernate-search-standalone.elasticsearch.version", "opensearch:2.16")); + "quarkus.hibernate-search-standalone.elasticsearch.version", "opensearch:3.0")); return config; } diff --git a/integration-tests/hibernate-search-standalone-opensearch/src/test/java/io/quarkus/it/hibernate/search/standalone/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledImplicitlyTest.java b/integration-tests/hibernate-search-standalone-opensearch/src/test/java/io/quarkus/it/hibernate/search/standalone/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledImplicitlyTest.java index 246a745b10f86..945362a08bf29 100644 --- a/integration-tests/hibernate-search-standalone-opensearch/src/test/java/io/quarkus/it/hibernate/search/standalone/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledImplicitlyTest.java +++ b/integration-tests/hibernate-search-standalone-opensearch/src/test/java/io/quarkus/it/hibernate/search/standalone/opensearch/devservices/HibernateSearchOpenSearchDevServicesDisabledImplicitlyTest.java @@ -36,7 +36,7 @@ public Map getConfigOverrides() { // But here it doesn't matter as we won't send a request to OpenSearch anyway, // so we're free to put anything. // Just make sure to set something consistent with what we have in application.properties. - "quarkus.hibernate-search-standalone.elasticsearch.version", "opensearch:2.16"); + "quarkus.hibernate-search-standalone.elasticsearch.version", "opensearch:3.0"); } @Override diff --git a/integration-tests/jpa-mapping-xml/legacy-app/src/main/java/io/quarkus/it/jpa/mapping/xml/legacy/app/SchemaUtil.java b/integration-tests/jpa-mapping-xml/legacy-app/src/main/java/io/quarkus/it/jpa/mapping/xml/legacy/app/SchemaUtil.java index bf4ede5b91fe5..14bb4691ec995 100644 --- a/integration-tests/jpa-mapping-xml/legacy-app/src/main/java/io/quarkus/it/jpa/mapping/xml/legacy/app/SchemaUtil.java +++ b/integration-tests/jpa-mapping-xml/legacy-app/src/main/java/io/quarkus/it/jpa/mapping/xml/legacy/app/SchemaUtil.java @@ -7,7 +7,6 @@ import jakarta.persistence.EntityManagerFactory; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.persister.entity.AbstractEntityPersister; public final class SchemaUtil { @@ -16,9 +15,9 @@ private SchemaUtil() { public static Set getColumnNames(EntityManagerFactory entityManagerFactory, Class entityType) { Set result = new HashSet<>(); - AbstractEntityPersister persister = (AbstractEntityPersister) entityManagerFactory - .unwrap(SessionFactoryImplementor.class) - .getMetamodel().entityPersister(entityType); + var persister = entityManagerFactory.unwrap(SessionFactoryImplementor.class) + .getMappingMetamodel() + .getEntityDescriptor(entityType); if (persister == null) { return result; } diff --git a/integration-tests/jpa-mapping-xml/modern-app/src/main/java/io/quarkus/it/jpa/mapping/xml/modern/app/SchemaUtil.java b/integration-tests/jpa-mapping-xml/modern-app/src/main/java/io/quarkus/it/jpa/mapping/xml/modern/app/SchemaUtil.java index 6a2bf1e9df028..615bc1660f4e0 100644 --- a/integration-tests/jpa-mapping-xml/modern-app/src/main/java/io/quarkus/it/jpa/mapping/xml/modern/app/SchemaUtil.java +++ b/integration-tests/jpa-mapping-xml/modern-app/src/main/java/io/quarkus/it/jpa/mapping/xml/modern/app/SchemaUtil.java @@ -7,7 +7,6 @@ import jakarta.persistence.EntityManagerFactory; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.persister.entity.AbstractEntityPersister; public final class SchemaUtil { @@ -16,9 +15,9 @@ private SchemaUtil() { public static Set getColumnNames(EntityManagerFactory entityManagerFactory, Class entityType) { Set result = new HashSet<>(); - AbstractEntityPersister persister = (AbstractEntityPersister) entityManagerFactory - .unwrap(SessionFactoryImplementor.class) - .getMetamodel().entityPersister(entityType); + var persister = entityManagerFactory.unwrap(SessionFactoryImplementor.class) + .getMappingMetamodel() + .getEntityDescriptor(entityType); if (persister == null) { return result; } diff --git a/integration-tests/jpa-postgresql/src/main/java/io/quarkus/it/jpa/postgresql/defaultpu/Person.java b/integration-tests/jpa-postgresql/src/main/java/io/quarkus/it/jpa/postgresql/defaultpu/Person.java index 22b6dfa87c7b6..68d171398f914 100644 --- a/integration-tests/jpa-postgresql/src/main/java/io/quarkus/it/jpa/postgresql/defaultpu/Person.java +++ b/integration-tests/jpa-postgresql/src/main/java/io/quarkus/it/jpa/postgresql/defaultpu/Person.java @@ -1,5 +1,7 @@ package io.quarkus.it.jpa.postgresql.defaultpu; +import static org.hibernate.type.SqlTypes.INTERVAL_SECOND; + import java.time.Duration; import jakarta.persistence.CascadeType; @@ -13,8 +15,7 @@ import jakarta.persistence.NamedQuery; import jakarta.persistence.Table; -import org.hibernate.annotations.JdbcType; -import org.hibernate.dialect.PostgreSQLIntervalSecondJdbcType; +import org.hibernate.annotations.JdbcTypeCode; @Entity @Table(schema = "myschema") @@ -78,9 +79,7 @@ public void setStatus(Status status) { * @see org.hibernate.type.descriptor.sql.internal.Scale6IntervalSecondDdlType */ @Column(precision = 5, scale = 5) - //NOTE: while https://hibernate.atlassian.net/browse/HHH-16591 is open we cannot replace the currently used @JdbcType annotation - // with a @JdbcTypeCode( INTERVAL_SECOND ) - @JdbcType(PostgreSQLIntervalSecondJdbcType.class) + @JdbcTypeCode(INTERVAL_SECOND) public Duration getLatestLunchBreakDuration() { return latestLunchBreakDuration; } diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/TestIntegrator.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/TestIntegrator.java index 60b171b7355c0..086d5726d9ca9 100644 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/TestIntegrator.java +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/TestIntegrator.java @@ -3,6 +3,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.hibernate.boot.Metadata; +import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.integrator.spi.Integrator; import org.hibernate.service.spi.SessionFactoryServiceRegistry; @@ -11,8 +12,8 @@ public class TestIntegrator implements Integrator { public static final AtomicInteger COUNTER = new AtomicInteger(); @Override - public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, - SessionFactoryServiceRegistry serviceRegistry) { + public void integrate(Metadata metadata, BootstrapContext bootstrapContext, + SessionFactoryImplementor sessionFactory) { COUNTER.incrementAndGet(); } diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Dog.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Dog.java index 30e16e8356b2a..724d6be1e6e5a 100644 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Dog.java +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Dog.java @@ -3,10 +3,7 @@ import jakarta.persistence.DiscriminatorValue; import jakarta.persistence.Entity; -import org.hibernate.annotations.Proxy; - @Entity -@Proxy(proxyClass = DogProxy.class) @DiscriminatorValue("DOG") public class Dog extends Pet implements DogProxy { diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Pet.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Pet.java index 8da2622a49b81..c2b983a45152d 100644 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Pet.java +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Pet.java @@ -6,11 +6,11 @@ import jakarta.persistence.Id; import jakarta.persistence.Inheritance; -import org.hibernate.annotations.Proxy; +import org.hibernate.annotations.ConcreteProxy; @Inheritance() @DiscriminatorColumn -@Proxy(proxyClass = PetProxy.class) +@ConcreteProxy @DiscriminatorValue("PET") @Entity public class Pet implements PetProxy { diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/ProxyTestEndpoint.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/ProxyTestEndpoint.java index be2a1564d561f..570334dce2930 100644 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/ProxyTestEndpoint.java +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/ProxyTestEndpoint.java @@ -90,28 +90,27 @@ public String inheritance() { PetOwner owner = entityManager.find(PetOwner.class, 1); expectEquals("Stuart", owner.getName()); expectEquals("Generic pet noises", owner.getPet().makeNoise()); - expectFalse(owner.getPet() instanceof Pet); - expectTrue(owner.getPet() instanceof DogProxy); //even though it is not a dog it still should implement the interface + + // Concrete proxies extend the actual class of the target entity + expectTrue(owner.getPet() instanceof Pet); + expectFalse(owner.getPet() instanceof DogProxy); owner = entityManager.find(PetOwner.class, 2); expectEquals("Sanne", owner.getName()); expectEquals("Meow", owner.getPet().makeNoise()); - DogProxy dogProxy = (DogProxy) owner.getPet(); - try { - dogProxy.bark(); - throw new RuntimeException("Should have failed as not a dog"); - } catch (ClassCastException e) { - - } - expectFalse(owner.getPet() instanceof Pet); + // Concrete proxies extend the actual class of the target entity + expectTrue(owner.getPet() instanceof Pet); + expectFalse(owner.getPet() instanceof DogProxy); owner = entityManager.find(PetOwner.class, 3); expectEquals("Emmanuel", owner.getName()); expectEquals("Woof", owner.getPet().makeNoise()); expectEquals("Woof", ((DogProxy) owner.getPet()).bark()); expectEquals("Rubber Bone", ((DogProxy) owner.getPet()).getFavoriteToy()); - expectFalse(owner.getPet() instanceof Pet); + + // Concrete proxies extend the actual class of the target entity + expectTrue(owner.getPet() instanceof Pet); expectTrue(owner.getPet() instanceof DogProxy); return "OK"; diff --git a/integration-tests/maven/src/test/resources-filtered/projects/apt-in-annotation-processor-paths/pom.xml b/integration-tests/maven/src/test/resources-filtered/projects/apt-in-annotation-processor-paths/pom.xml index d1d8df1882029..5ccf1727b91d3 100644 --- a/integration-tests/maven/src/test/resources-filtered/projects/apt-in-annotation-processor-paths/pom.xml +++ b/integration-tests/maven/src/test/resources-filtered/projects/apt-in-annotation-processor-paths/pom.xml @@ -64,7 +64,7 @@ org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor com.querydsl diff --git a/integration-tests/maven/src/test/resources-filtered/projects/apt-in-annotation-processors/pom.xml b/integration-tests/maven/src/test/resources-filtered/projects/apt-in-annotation-processors/pom.xml index 6204f590a11d8..8b8d2d3bf3076 100644 --- a/integration-tests/maven/src/test/resources-filtered/projects/apt-in-annotation-processors/pom.xml +++ b/integration-tests/maven/src/test/resources-filtered/projects/apt-in-annotation-processors/pom.xml @@ -65,7 +65,7 @@ org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor com.querydsl @@ -76,7 +76,7 @@ - org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor + org.hibernate.processor.HibernateProcessor diff --git a/integration-tests/maven/src/test/resources-filtered/projects/apt-in-classpath/pom.xml b/integration-tests/maven/src/test/resources-filtered/projects/apt-in-classpath/pom.xml index 2b8eed57eb392..b19864da41e08 100644 --- a/integration-tests/maven/src/test/resources-filtered/projects/apt-in-classpath/pom.xml +++ b/integration-tests/maven/src/test/resources-filtered/projects/apt-in-classpath/pom.xml @@ -47,7 +47,7 @@ org.hibernate.orm - hibernate-jpamodelgen + hibernate-processor provided diff --git a/pom.xml b/pom.xml index 98c2c00546576..e2f74d2f9a50c 100644 --- a/pom.xml +++ b/pom.xml @@ -71,14 +71,14 @@ 0.8.13 7.3.1 5.5.5 - 6.6.17.Final - 3.1.0 + 7.0.0.Final + 3.2.0 4.13.0 1.15.11 - 7.0.3.Final - 2.4.8.Final + 1.0.0 + 3.0.0.Final 9.0.0.Final - 7.2.4.Final + 8.0.0.Final 1.69.1