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/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..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 @@ -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,17 @@ 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). + // 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.LEGACY; + } + } 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")); diff --git a/pom.xml b/pom.xml index bbdcf6d9e96ab..f24d3a25d994b 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.3.Final 4.13.0 1.14.18 7.0.3.Final