Skip to content

Commit bfc5fc8

Browse files
committed
Make methods of reachable hibernate services reflectively queryable
Relates to quarkusio#41995 Closes quarkusio#45525
1 parent ad0a86b commit bfc5fc8

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
9898
import io.quarkus.deployment.builditem.LiveReloadBuildItem;
9999
import io.quarkus.deployment.builditem.LogCategoryBuildItem;
100+
import io.quarkus.deployment.builditem.NativeImageFeatureBuildItem;
100101
import io.quarkus.deployment.builditem.ServiceStartBuildItem;
101102
import io.quarkus.deployment.builditem.SystemPropertyBuildItem;
102103
import io.quarkus.deployment.builditem.TransformedClassesBuildItem;
@@ -125,6 +126,7 @@
125126
import io.quarkus.hibernate.orm.runtime.boot.xml.RecordableXmlMapping;
126127
import io.quarkus.hibernate.orm.runtime.config.DialectVersions;
127128
import io.quarkus.hibernate.orm.runtime.dev.HibernateOrmDevIntegrator;
129+
import io.quarkus.hibernate.orm.runtime.graal.RegisterServicesForReflectionFeature;
128130
import io.quarkus.hibernate.orm.runtime.integration.HibernateOrmIntegrationStaticDescriptor;
129131
import io.quarkus.hibernate.orm.runtime.migration.MultiTenancyStrategy;
130132
import 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 numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
}

0 commit comments

Comments
 (0)