File tree Expand file tree Collapse file tree 2 files changed +42
-0
lines changed
deployment/src/main/java/io/quarkus/hibernate/orm/deployment
runtime/src/main/java/io/quarkus/hibernate/orm/runtime/graal Expand file tree Collapse file tree 2 files changed +42
-0
lines changed Original file line number Diff line number Diff line change 9797import io .quarkus .deployment .builditem .LaunchModeBuildItem ;
9898import io .quarkus .deployment .builditem .LiveReloadBuildItem ;
9999import io .quarkus .deployment .builditem .LogCategoryBuildItem ;
100+ import io .quarkus .deployment .builditem .NativeImageFeatureBuildItem ;
100101import io .quarkus .deployment .builditem .ServiceStartBuildItem ;
101102import io .quarkus .deployment .builditem .SystemPropertyBuildItem ;
102103import io .quarkus .deployment .builditem .TransformedClassesBuildItem ;
125126import io .quarkus .hibernate .orm .runtime .boot .xml .RecordableXmlMapping ;
126127import io .quarkus .hibernate .orm .runtime .config .DialectVersions ;
127128import io .quarkus .hibernate .orm .runtime .dev .HibernateOrmDevIntegrator ;
129+ import io .quarkus .hibernate .orm .runtime .graal .RegisterServicesForReflectionFeature ;
128130import io .quarkus .hibernate .orm .runtime .integration .HibernateOrmIntegrationStaticDescriptor ;
129131import io .quarkus .hibernate .orm .runtime .migration .MultiTenancyStrategy ;
130132import io .quarkus .hibernate .orm .runtime .proxies .PreGeneratedProxies ;
@@ -160,6 +162,11 @@ public final class HibernateOrmProcessor {
160162
161163 private static final String INTEGRATOR_SERVICE_FILE = "META-INF/services/org.hibernate.integrator.spi.Integrator" ;
162164
165+ @ BuildStep
166+ NativeImageFeatureBuildItem registerServicesForReflection () {
167+ return new NativeImageFeatureBuildItem (RegisterServicesForReflectionFeature .class );
168+ }
169+
163170 @ BuildStep
164171 void registerHibernateOrmMetadataForCoreDialects (
165172 BuildProducer <DatabaseKindDialectBuildItem > producer ) {
Original file line number Diff line number Diff line change 1+ package io .quarkus .hibernate .orm .runtime .graal ;
2+
3+ import java .util .HashSet ;
4+ import java .util .Set ;
5+
6+ import org .graalvm .nativeimage .hosted .Feature ;
7+ import org .graalvm .nativeimage .hosted .RuntimeReflection ;
8+
9+ /**
10+ * Makes methods of reachable hibernate services accessible through {@link Class#getMethods()}.
11+ *
12+ * See <a href="https://github.com/quarkusio/quarkus/issues/45525">Github issue #45525</a>.
13+ */
14+ public class RegisterServicesForReflectionFeature implements Feature {
15+
16+ @ Override
17+ public String getDescription () {
18+ return "Makes methods of reachable hibernate services accessible through getMethods()`" ;
19+ }
20+
21+ // The {@code duringAnalysis} method is invoked multiple times and increases the set of reachable types, thus we
22+ // need to invoke {@link DuringAnalysisAccess#requireAnalysisIteration()} each time we register new methods.
23+ private static final int ANTICIPATED_SERVICES = 100 ;
24+ private static final Set <Class <?>> registeredClasses = new HashSet <>(ANTICIPATED_SERVICES );
25+
26+ @ Override
27+ public void duringAnalysis (DuringAnalysisAccess access ) {
28+ for (Class <?> service : access .reachableSubtypes (org .hibernate .service .Service .class )) {
29+ if (registeredClasses .add (service )) {
30+ RuntimeReflection .registerAllMethods (service );
31+ access .requireAnalysisIteration ();
32+ }
33+ }
34+ }
35+ }
You can’t perform that action at this time.
0 commit comments