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 9d08bb32d1806..5dd0a319845f8 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 @@ -106,6 +106,9 @@ public final class HibernateOrmProcessor { private static final DotName PERSISTENCE_UNIT = DotName.createSimple(PersistenceUnit.class.getName()); private static final DotName PRODUCES = DotName.createSimple(Produces.class.getName()); + private static final String INTEGRATOR_SERVICE_FILE = "META-INF/services/org.hibernate.integrator.spi.Integrator"; + private static final String SERVICE_CONTRIBUTOR_SERVICE_FILE = "META-INF/services/org.hibernate.service.spi.ServiceContributor"; + /** * Hibernate ORM configuration */ @@ -125,6 +128,9 @@ public SystemPropertyBuildItem enforceDisableRuntimeEnhancer() { List hotDeploymentWatchedFiles(LaunchModeBuildItem launchMode) { List watchedFiles = new ArrayList<>(); watchedFiles.add(new HotDeploymentWatchedFileBuildItem("META-INF/persistence.xml")); + watchedFiles.add(new HotDeploymentWatchedFileBuildItem(INTEGRATOR_SERVICE_FILE)); + watchedFiles.add(new HotDeploymentWatchedFileBuildItem(SERVICE_CONTRIBUTOR_SERVICE_FILE)); + getSqlLoadScript(launchMode.getLaunchMode()).ifPresent(script -> { watchedFiles.add(new HotDeploymentWatchedFileBuildItem(script)); }); @@ -222,17 +228,16 @@ public void build(RecorderContext recorderContext, HibernateOrmRecorder recorder recorderContext.registerNonDefaultConstructor(ParsedPersistenceXmlDescriptor.class.getDeclaredConstructor(URL.class), (i) -> Collections.singletonList(i.getPersistenceUnitRootUrl())); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); // inspect service files for additional integrators Collection> integratorClasses = new LinkedHashSet<>(); - for (String integratorClassName : ServiceUtil.classNamesNamedIn(getClass().getClassLoader(), - "META-INF/services/org.hibernate.integrator.spi.Integrator")) { + for (String integratorClassName : ServiceUtil.classNamesNamedIn(classLoader, INTEGRATOR_SERVICE_FILE)) { integratorClasses.add((Class) recorderContext.classProxy(integratorClassName)); } - // inspect service files for service contributors Collection> serviceContributorClasses = new LinkedHashSet<>(); - for (String serviceContributorClassName : ServiceUtil.classNamesNamedIn(getClass().getClassLoader(), - "META-INF/services/org.hibernate.service.spi.ServiceContributor")) { + for (String serviceContributorClassName : ServiceUtil.classNamesNamedIn(classLoader, + SERVICE_CONTRIBUTOR_SERVICE_FILE)) { serviceContributorClasses .add((Class) recorderContext.classProxy(serviceContributorClassName)); } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/JPAConfig.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/JPAConfig.java index ddd17b6edbf8e..aad2ca171460b 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/JPAConfig.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/JPAConfig.java @@ -8,6 +8,7 @@ import javax.annotation.PreDestroy; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.BeforeDestroyed; +import javax.enterprise.event.Observes; import javax.inject.Singleton; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; @@ -74,7 +75,7 @@ boolean isJtaEnabled() { * * @param event ignored */ - void destroy(@BeforeDestroyed(ApplicationScoped.class) Object event) { + void destroy(@Observes @BeforeDestroyed(ApplicationScoped.class) Object event) { for (LazyPersistenceUnit factory : persistenceUnits.values()) { try { factory.close(); diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/IntegratorResource.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/IntegratorResource.java new file mode 100644 index 0000000000000..3490993b608b1 --- /dev/null +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/IntegratorResource.java @@ -0,0 +1,24 @@ +package io.quarkus.it.jpa.integrator; + +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path("/integrator") +@ApplicationScoped +public class IntegratorResource { + + @Inject + EntityManager em; + + @GET + @Produces(MediaType.TEXT_PLAIN) + public int create() { + return TestIntegrator.COUNTER.get(); + } + +} 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 new file mode 100644 index 0000000000000..60b171b7355c0 --- /dev/null +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/TestIntegrator.java @@ -0,0 +1,23 @@ +package io.quarkus.it.jpa.integrator; + +import java.util.concurrent.atomic.AtomicInteger; + +import org.hibernate.boot.Metadata; +import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.integrator.spi.Integrator; +import org.hibernate.service.spi.SessionFactoryServiceRegistry; + +public class TestIntegrator implements Integrator { + public static final AtomicInteger COUNTER = new AtomicInteger(); + + @Override + public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, + SessionFactoryServiceRegistry serviceRegistry) { + COUNTER.incrementAndGet(); + } + + @Override + public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { + COUNTER.decrementAndGet(); + } +} diff --git a/integration-tests/jpa/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator b/integration-tests/jpa/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator new file mode 100644 index 0000000000000..94c4108d4f28d --- /dev/null +++ b/integration-tests/jpa/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator @@ -0,0 +1 @@ +io.quarkus.it.jpa.integrator.TestIntegrator \ No newline at end of file diff --git a/integration-tests/jpa/src/test/java/io/quarkus/it/jpa/integrator/JPAIntegratorTest.java b/integration-tests/jpa/src/test/java/io/quarkus/it/jpa/integrator/JPAIntegratorTest.java new file mode 100644 index 0000000000000..0b6a6312a18a0 --- /dev/null +++ b/integration-tests/jpa/src/test/java/io/quarkus/it/jpa/integrator/JPAIntegratorTest.java @@ -0,0 +1,20 @@ +package io.quarkus.it.jpa.integrator; + +import static io.restassured.RestAssured.when; +import static org.hamcrest.core.Is.is; + +import org.junit.jupiter.api.Test; + +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +public class JPAIntegratorTest { + + @Test + public void testInjection() { + when().get("/jpa-test/integrator").then() + .statusCode(200) + .body(is("1")); + } + +}