From b6bbaac50de67ddc71133f0ee4e73266cc7d9cbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Mon, 17 Oct 2022 10:25:58 +0200 Subject: [PATCH] [#28576] Allow assigning entities to the Hibernate Reactive PU explicitly (cherry picked from commit 311eb83cfc39069728f0ea1603143049cd74aff5) --- .../orm/deployment/HibernateOrmProcessor.java | 2 +- .../HibernateReactiveProcessor.java | 36 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) 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 9c77e933e5b5d..3b9d8b956f323 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 @@ -1230,7 +1230,7 @@ private void enhanceEntities(final JpaModelBuildItem jpaModel, } } - private static Map> getModelClassesAndPackagesPerPersistenceUnits(HibernateOrmConfig hibernateOrmConfig, + public static Map> getModelClassesAndPackagesPerPersistenceUnits(HibernateOrmConfig hibernateOrmConfig, JpaModelBuildItem jpaModel, IndexView index, boolean enableDefaultPersistenceUnit) { Map> modelClassesAndPackagesPerPersistenceUnits = new HashMap<>(); diff --git a/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java b/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java index 7743124459829..cb388fe109cb1 100644 --- a/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java +++ b/extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java @@ -18,6 +18,7 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.Properties; +import java.util.Set; import java.util.stream.Collectors; import javax.persistence.SharedCacheMode; @@ -111,7 +112,7 @@ public void build(RecorderContext recorderContext, @BuildStep public void buildReactivePersistenceUnit( - HibernateOrmConfig hibernateOrmConfig, + HibernateOrmConfig hibernateOrmConfig, CombinedIndexBuildItem index, DataSourcesBuildTimeConfig dataSourcesBuildTimeConfig, List persistenceXmlDescriptors, ApplicationArchivesBuildItem applicationArchivesBuildItem, @@ -154,7 +155,7 @@ public void buildReactivePersistenceUnit( final String dbKind = dbKindOptional.get(); HibernateOrmConfigPersistenceUnit persistenceUnitConfig = hibernateOrmConfig.defaultPersistenceUnit; ParsedPersistenceXmlDescriptor reactivePU = generateReactivePersistenceUnit( - hibernateOrmConfig, persistenceUnitConfig, jpaModel, + hibernateOrmConfig, index, persistenceUnitConfig, jpaModel, dbKind, applicationArchivesBuildItem, launchMode.getLaunchMode(), systemProperties, nativeImageResources, hotDeploymentWatchedFiles, dbKindDialectBuildItems); @@ -202,8 +203,16 @@ PersistenceProviderSetUpBuildItem setUpPersistenceProviderAndWaitForVertxPool(Hi * - Any JDBC-only configuration settings are removed * - If we ever add any Reactive-only config settings, they can be set here */ + // TODO this whole method is really just a hack that duplicates + // io.quarkus.hibernate.orm.deployment.HibernateOrmProcessor.handleHibernateORMWithNoPersistenceXml + // and customizes it for Hibernate Reactive. + // we should work on a way to merge the two methods while still having some behavior specific to + // HR/ORM, because it's likely the HR implementation is missing some features, + // and we've seen in the past that features we add to handleHibernateORMWithNoPersistenceXml + // tend not to be added here. + // See https://github.com/quarkusio/quarkus/issues/28629. private static ParsedPersistenceXmlDescriptor generateReactivePersistenceUnit( - HibernateOrmConfig hibernateOrmConfig, + HibernateOrmConfig hibernateOrmConfig, CombinedIndexBuildItem index, HibernateOrmConfigPersistenceUnit persistenceUnitConfig, JpaModelBuildItem jpaModel, String dbKind, @@ -230,7 +239,26 @@ private static ParsedPersistenceXmlDescriptor generateReactivePersistenceUnit( desc.setTransactionType(PersistenceUnitTransactionType.RESOURCE_LOCAL); desc.getProperties().setProperty(AvailableSettings.DIALECT, dialect); desc.setExcludeUnlistedClasses(true); - desc.addClasses(new ArrayList<>(jpaModel.getAllModelClassNames())); + + Map> modelClassesAndPackagesPerPersistencesUnits = HibernateOrmProcessor + .getModelClassesAndPackagesPerPersistenceUnits(hibernateOrmConfig, jpaModel, index.getIndex(), true); + Set nonDefaultPUWithModelClassesOrPackages = modelClassesAndPackagesPerPersistencesUnits.entrySet().stream() + .filter(e -> !PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME.equals(e.getKey()) && !e.getValue().isEmpty()) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + if (!nonDefaultPUWithModelClassesOrPackages.isEmpty()) { + // Not supported yet; see https://github.com/quarkusio/quarkus/issues/21110 + LOG.warnf("Entities are affected to non-default Hibernate Reactive persistence units %s." + + " Since Hibernate Reactive only works with the default persistence unit, those entities will be ignored.", + nonDefaultPUWithModelClassesOrPackages); + } + Set modelClassesAndPackages = modelClassesAndPackagesPerPersistencesUnits + .getOrDefault(PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME, Collections.emptySet()); + if (modelClassesAndPackages.isEmpty()) { + LOG.warnf("Could not find any entities affected to the Hibernate Reactive persistence unit."); + } else { + desc.addClasses(new ArrayList<>(modelClassesAndPackages)); + } // The storage engine has to be set as a system property. if (persistenceUnitConfig.dialect.storageEngine.isPresent()) {