From fcc263d0a8688d666cf45b86ad2622b12378ccb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 8 Nov 2024 09:56:17 +0100 Subject: [PATCH 1/5] Ignore some documentation-related annotations in Hibernate ORM extension tests --- .../io/quarkus/hibernate/orm/deployment/ClassNamesTest.java | 2 ++ 1 file changed, 2 insertions(+) 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 60b94f4c7ddef..66ca64943ca52 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 @@ -107,6 +107,8 @@ public void testNoMissingHibernateAnnotation() { } private static void ignoreInternalAnnotations(Set annotationSet) { + annotationSet.removeIf(name -> name.toString().equals("org.hibernate.cfg.Compatibility")); + annotationSet.removeIf(name -> name.toString().equals("org.hibernate.cfg.Unsafe")); annotationSet.removeIf(name -> name.toString().equals("org.hibernate.Incubating")); annotationSet.removeIf(name -> name.toString().equals("org.hibernate.Internal")); annotationSet.removeIf(name -> name.toString().equals("org.hibernate.Remove")); From 0357c3350ed0fc9eba54fcf8347d3da89d256fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 8 Nov 2024 09:56:36 +0100 Subject: [PATCH 2/5] Upgrade to Hibernate ORM 6.6.2.Final --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bbdcf6d9e96ab..09e6c4cdc12f0 100644 --- a/pom.xml +++ b/pom.xml @@ -71,7 +71,7 @@ 0.8.12 6.13.4 5.5.0 - 6.6.1.Final + 6.6.2.Final 4.13.0 1.14.18 7.0.3.Final From 28cbabcf307fa6b1e1486bc87b015f6912282392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 8 Nov 2024 16:15:27 +0100 Subject: [PATCH 3/5] Upgrade to Hibernate ORM 6.6.3.Final --- .../quarkus/hibernate/orm/deployment/ClassNames.java | 3 +++ .../hibernate/orm/deployment/GraalVMFeatures.java | 10 ++++++++++ pom.xml | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) 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 3f79f8d71ba34..f7e6bd6d5f620 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 @@ -455,6 +455,9 @@ 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 652de267cc10f..d964cdae8694c 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 @@ -39,4 +39,14 @@ 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 + @BuildStep + ReflectiveClassBuildItem registerStandardStackElementTypesForReflection() { + 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") + .build(); + } + } diff --git a/pom.xml b/pom.xml index 09e6c4cdc12f0..f24d3a25d994b 100644 --- a/pom.xml +++ b/pom.xml @@ -71,7 +71,7 @@ 0.8.12 6.13.4 5.5.0 - 6.6.2.Final + 6.6.3.Final 4.13.0 1.14.18 7.0.3.Final From 7df943af570b7cf5dfe7730c586fc92aaef7113f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 8 Nov 2024 17:34:04 +0100 Subject: [PATCH 4/5] Fail the build instead of skipping Hibernate ORM bytecode enhancement when it's unsupported --- .../integration/QuarkusEnhancementContext.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/integration/QuarkusEnhancementContext.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/integration/QuarkusEnhancementContext.java index bdbbe3ee916b3..3afc9e59e5c5b 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/integration/QuarkusEnhancementContext.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/integration/QuarkusEnhancementContext.java @@ -2,6 +2,7 @@ import org.hibernate.bytecode.enhance.spi.DefaultEnhancementContext; import org.hibernate.bytecode.enhance.spi.UnloadedField; +import org.hibernate.bytecode.enhance.spi.UnsupportedEnhancementStrategy; public final class QuarkusEnhancementContext extends DefaultEnhancementContext { @@ -26,4 +27,15 @@ public ClassLoader getLoadingClassLoader() { throw new IllegalStateException("The Classloader of the EnhancementContext should not be used"); } + @Override + public UnsupportedEnhancementStrategy getUnsupportedEnhancementStrategy() { + // We expect model classes to be enhanced. + // Lack of enhancement could lead to many problems, + // from bad performance, to Quarkus-specific optimizations causing errors/data loss, + // to incorrect generated bytecode (references to non-existing methods). + // If something prevents enhancement, it's just safer to have Hibernate ORM's enhancer fail + // with a clear error message pointing to the application class that needs to be fixed. + return UnsupportedEnhancementStrategy.FAIL; + } + } From 94aece2973ca2605f09ad24ed53dc635aaa3686e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 22 Nov 2024 17:07:14 +0100 Subject: [PATCH 5/5] Revert to legacy behavior for Hibernate ORM bytecode enhancement of unsupported classes For backwards compatibility reasons. --- .../deployment/integration/QuarkusEnhancementContext.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/integration/QuarkusEnhancementContext.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/integration/QuarkusEnhancementContext.java index 3afc9e59e5c5b..4a42c87dac784 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/integration/QuarkusEnhancementContext.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/integration/QuarkusEnhancementContext.java @@ -33,9 +33,11 @@ public UnsupportedEnhancementStrategy getUnsupportedEnhancementStrategy() { // Lack of enhancement could lead to many problems, // from bad performance, to Quarkus-specific optimizations causing errors/data loss, // to incorrect generated bytecode (references to non-existing methods). - // If something prevents enhancement, it's just safer to have Hibernate ORM's enhancer fail + // For backwards compatibility reason, in this branch we adopt the legacy behavior of Hibernate ORM, + // which is to try to enhance all classes, ignoring any known issue. + // However, later versions of Quarkus (3.17+ at least) just have Hibernate ORM's enhancer fail. // with a clear error message pointing to the application class that needs to be fixed. - return UnsupportedEnhancementStrategy.FAIL; + return UnsupportedEnhancementStrategy.LEGACY; } }