Skip to content

Commit 40575d4

Browse files
committed
WIP only deactivate if no entity and datasource inactive
1 parent 40539d1 commit 40575d4

File tree

7 files changed

+36
-17
lines changed

7 files changed

+36
-17
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ void generateHibernateBeans(HibernateOrmRecorder recorder,
188188
true, recorder.checkActiveSupplier(
189189
persistenceUnitDescriptor.getPersistenceUnitName(),
190190
persistenceUnitDescriptor.getConfig().getDataSource(),
191+
persistenceUnitDescriptor.getConfig().getEntityClassNames(),
191192
true));
192193

193194
produceSessionFactoryBean(syntheticBeanBuildItemBuildProducer, recorder, puRef);
@@ -214,6 +215,7 @@ void generateHibernateBeans(HibernateOrmRecorder recorder,
214215
recorder.checkActiveSupplier(
215216
persistenceUnitDescriptor.getPersistenceUnitName(),
216217
persistenceUnitDescriptor.getConfig().getDataSource(),
218+
persistenceUnitDescriptor.getConfig().getEntityClassNames(),
217219
persistenceUnitDescriptor.isFromPersistenceXml()));
218220

219221
produceSessionFactoryBean(syntheticBeanBuildItemBuildProducer, recorder, puRef);

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ public void configurationDescriptorBuilding(
372372
Optional.empty(),
373373
jdbcDataSource.flatMap(JdbcDataSourceBuildItem::getDbVersion),
374374
Optional.ofNullable(xmlDescriptor.getProperties().getProperty(AvailableSettings.DIALECT)),
375+
Set.of(), // Not relevant for persistence.xml, because such a PU never gets deactivated.
375376
getMultiTenancyStrategy(
376377
Optional.ofNullable(persistenceXmlDescriptorBuildItem.getDescriptor()
377378
.getProperties().getProperty("hibernate.multiTenancy"))), //FIXME this property is meaningless in Hibernate ORM 6
@@ -903,7 +904,7 @@ private void handleHibernateORMWithNoPersistenceXml(
903904

904905
if (enableDefaultPersistenceUnit) {
905906
producePersistenceUnitDescriptorFromConfig(
906-
hibernateOrmConfig, PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME,
907+
hibernateOrmConfig, jpaModel, PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME,
907908
hibernateOrmConfig.defaultPersistenceUnit(),
908909
modelClassesAndPackagesForDefaultPersistenceUnit,
909910
jpaModel.getXmlMappings(PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME),
@@ -923,7 +924,7 @@ private void handleHibernateORMWithNoPersistenceXml(
923924
for (Entry<String, HibernateOrmConfigPersistenceUnit> persistenceUnitEntry : hibernateOrmConfig.namedPersistenceUnits()
924925
.entrySet()) {
925926
producePersistenceUnitDescriptorFromConfig(
926-
hibernateOrmConfig, persistenceUnitEntry.getKey(), persistenceUnitEntry.getValue(),
927+
hibernateOrmConfig, jpaModel, persistenceUnitEntry.getKey(), persistenceUnitEntry.getValue(),
927928
modelClassesAndPackagesPerPersistencesUnits.getOrDefault(persistenceUnitEntry.getKey(),
928929
Collections.emptySet()),
929930
jpaModel.getXmlMappings(persistenceUnitEntry.getKey()),
@@ -939,7 +940,7 @@ private void handleHibernateORMWithNoPersistenceXml(
939940
}
940941

941942
private static void producePersistenceUnitDescriptorFromConfig(
942-
HibernateOrmConfig hibernateOrmConfig,
943+
HibernateOrmConfig hibernateOrmConfig, JpaModelBuildItem jpaModel,
943944
String persistenceUnitName,
944945
HibernateOrmConfigPersistenceUnit persistenceUnitConfig,
945946
Set<String> modelClassesAndPackages,
@@ -981,6 +982,8 @@ private static void producePersistenceUnitDescriptorFromConfig(
981982
new ArrayList<>(modelClassesAndPackages),
982983
new Properties(),
983984
false);
985+
Set<String> entityClassNames = new HashSet<>(descriptor.getManagedClassNames());
986+
entityClassNames.retainAll(jpaModel.getEntityClassNames());
984987

985988
MultiTenancyStrategy multiTenancyStrategy = getMultiTenancyStrategy(persistenceUnitConfig.multitenant());
986989

@@ -1010,6 +1013,7 @@ private static void producePersistenceUnitDescriptorFromConfig(
10101013
supportedDatabaseKind.map(DatabaseKind.SupportedDatabaseKind::getMainName),
10111014
jdbcDataSource.flatMap(JdbcDataSourceBuildItem::getDbVersion),
10121015
persistenceUnitConfig.dialect().dialect(),
1016+
entityClassNames,
10131017
multiTenancyStrategy,
10141018
hibernateOrmConfig.database().ormCompatibilityVersion(),
10151019
hibernateOrmConfig.mapping().format().global(),

extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRecorder.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.ArrayList;
44
import java.util.Collection;
5+
import java.util.Collections;
56
import java.util.List;
67
import java.util.Locale;
78
import java.util.Map;
@@ -119,8 +120,8 @@ public void startAllPersistenceUnits(BeanContainer beanContainer, ShutdownContex
119120
jpaConfig.startAll();
120121
}
121122

122-
public Supplier<ActiveResult> checkActiveSupplier(String persistenceUnitName,
123-
Optional<String> dataSourceName, boolean isFromPersistenceXml) {
123+
public Supplier<ActiveResult> checkActiveSupplier(String persistenceUnitName, Optional<String> dataSourceName,
124+
Set<String> entityClassNames, boolean isFromPersistenceXml) {
124125
return new Supplier<>() {
125126
@Override
126127
public ActiveResult get() {
@@ -135,16 +136,15 @@ public ActiveResult get() {
135136
PersistenceUnitUtil.persistenceUnitInactiveReasonDeactivated(persistenceUnitName, dataSourceName));
136137
}
137138

138-
if (dataSourceName.isPresent()) {
139-
// Persistence units are inactive when the corresponding datasource is inactive.
139+
if (entityClassNames.isEmpty() && dataSourceName.isPresent()) {
140+
// Persistence units are inactive when they have no entity and the corresponding datasource is inactive.
140141
var dataSourceBean = AgroalDataSourceUtil.dataSourceInstance(dataSourceName.get()).getHandle().getBean();
141142
var dataSourceActive = dataSourceBean.checkActive();
142143
if (!dataSourceActive.value()) {
143144
return ActiveResult.inactive(
144145
String.format(Locale.ROOT,
145-
"Persistence unit '%s' was deactivated automatically because its datasource '%s' was deactivated.",
146-
persistenceUnitName,
147-
dataSourceName.get()),
146+
"Persistence unit '%s' was deactivated automatically because it doesn't include any entity type and its datasource '%s' was deactivated.",
147+
persistenceUnitName, dataSourceName.get()),
148148
dataSourceActive);
149149
}
150150
}

extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/recording/RecordedConfig.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.Map;
44
import java.util.Objects;
55
import java.util.Optional;
6+
import java.util.Set;
67

78
import io.quarkus.hibernate.orm.runtime.config.DatabaseOrmCompatibilityVersion;
89
import io.quarkus.hibernate.orm.runtime.customized.BuiltinFormatMapperBehaviour;
@@ -19,6 +20,7 @@ public class RecordedConfig {
1920
private final Optional<String> supportedDBkind;
2021
private final Optional<String> dbVersion;
2122
private final Optional<String> explicitDialect;
23+
private final Set<String> entityClassNames;
2224
private final MultiTenancyStrategy multiTenancyStrategy;
2325
private final Map<String, String> quarkusConfigUnsupportedProperties;
2426
private final DatabaseOrmCompatibilityVersion databaseOrmCompatibilityVersion;
@@ -28,7 +30,7 @@ public class RecordedConfig {
2830
@RecordableConstructor
2931
public RecordedConfig(Optional<String> dataSource, Optional<String> dbKind,
3032
Optional<String> supportedDBkind,
31-
Optional<String> dbVersion, Optional<String> explicitDialect,
33+
Optional<String> dbVersion, Optional<String> explicitDialect, Set<String> entityClassNames,
3234
MultiTenancyStrategy multiTenancyStrategy,
3335
DatabaseOrmCompatibilityVersion databaseOrmCompatibilityVersion,
3436
BuiltinFormatMapperBehaviour builtinFormatMapperBehaviour,
@@ -44,6 +46,7 @@ public RecordedConfig(Optional<String> dataSource, Optional<String> dbKind,
4446
this.supportedDBkind = supportedDBkind;
4547
this.dbVersion = dbVersion;
4648
this.explicitDialect = explicitDialect;
49+
this.entityClassNames = entityClassNames;
4750
this.multiTenancyStrategy = multiTenancyStrategy;
4851
this.databaseOrmCompatibilityVersion = databaseOrmCompatibilityVersion;
4952
this.builtinFormatMapperBehaviour = builtinFormatMapperBehaviour;
@@ -71,6 +74,10 @@ public Optional<String> getExplicitDialect() {
7174
return explicitDialect;
7275
}
7376

77+
public Set<String> getEntityClassNames() {
78+
return entityClassNames;
79+
}
80+
7481
public MultiTenancyStrategy getMultiTenancyStrategy() {
7582
return multiTenancyStrategy;
7683
}

extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveCdiProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ void produceSessionFactoryBean(
5858
// This startup() call is only necessary in order to trigger Arc's usage checks (fail startup if bean injected when a PU is inactive).
5959
.startup()
6060
.checkActive(recorder.checkActiveSupplier(persistenceUnitName,
61-
persistenceUnitDescriptor.getConfig().getDataSource()))
61+
persistenceUnitDescriptor.getConfig().getDataSource(),
62+
persistenceUnitDescriptor.getConfig().getEntityClassNames()))
6263
.createWith(recorder.mutinySessionFactory(persistenceUnitName))
6364
.addInjectionPoint(ClassType.create(DotName.createSimple(JPAConfig.class)));
6465

extensions/hibernate-reactive/deployment/src/main/java/io/quarkus/hibernate/reactive/deployment/HibernateReactiveProcessor.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.function.Function;
2424
import java.util.logging.Level;
2525

26+
import io.quarkus.arc.impl.Sets;
2627
import jakarta.persistence.PersistenceUnitTransactionType;
2728

2829
import org.hibernate.reactive.provider.impl.ReactiveIntegrator;
@@ -236,7 +237,7 @@ private static void producePersistenceUnitFromConfig(HibernateOrmConfig hibernat
236237

237238
QuarkusPersistenceUnitDescriptorWithSupportedDBKind reactivePUWithDBKind = generateReactivePersistenceUnit(
238239
hibernateOrmConfig, persistenceUnitName, index, persistenceUnitConfig, jpaModel,
239-
datasourceName, dbKindOptional, explicitDialect, explicitDbMinVersion, applicationArchivesBuildItem,
240+
dbKindOptional, explicitDialect, explicitDbMinVersion, applicationArchivesBuildItem,
240241
launchMode.getLaunchMode(),
241242
systemProperties, nativeImageResources, hotDeploymentWatchedFiles, dbKindDialectBuildItems,
242243
enableDefaultPersistenceUnit);
@@ -251,6 +252,8 @@ private static void producePersistenceUnitFromConfig(HibernateOrmConfig hibernat
251252
jsonMapper);
252253

253254
QuarkusPersistenceUnitDescriptor reactivePU = reactivePUWithDBKind.descriptor();
255+
Set<String> entityClassNames = new HashSet<>(reactivePU.getManagedClassNames());
256+
entityClassNames.retainAll(jpaModel.getEntityClassNames());
254257

255258
//Some constant arguments to the following method:
256259
// - this is Reactive
@@ -263,6 +266,7 @@ private static void producePersistenceUnitFromConfig(HibernateOrmConfig hibernat
263266
reactivePUWithDBKind.supportedDatabaseKind.map(DatabaseKind.SupportedDatabaseKind::getMainName),
264267
dbVersion,
265268
persistenceUnitConfig.dialect().dialect(),
269+
entityClassNames,
266270
io.quarkus.hibernate.orm.runtime.migration.MultiTenancyStrategy.NONE,
267271
hibernateOrmConfig.database().ormCompatibilityVersion(),
268272
hibernateOrmConfig.mapping().format().global(),
@@ -347,7 +351,6 @@ private static QuarkusPersistenceUnitDescriptorWithSupportedDBKind generateReact
347351
CombinedIndexBuildItem index,
348352
HibernateOrmConfigPersistenceUnit persistenceUnitConfig,
349353
JpaModelBuildItem jpaModel,
350-
Optional<String> dataSourceName,
351354
Optional<String> dbKindOptional,
352355
Optional<String> explicitDialect,
353356
Optional<String> explicitDbMinVersion,

extensions/hibernate-reactive/runtime/src/main/java/io/quarkus/hibernate/reactive/runtime/HibernateReactiveRecorder.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.Locale;
55
import java.util.Map;
66
import java.util.Optional;
7+
import java.util.Set;
78
import java.util.function.Function;
89
import java.util.function.Supplier;
910

@@ -43,7 +44,8 @@ public void initializePersistenceProvider(
4344
integrationRuntimeDescriptors);
4445
}
4546

46-
public Supplier<ActiveResult> checkActiveSupplier(String puName, Optional<String> dataSourceName) {
47+
public Supplier<ActiveResult> checkActiveSupplier(String puName, Optional<String> dataSourceName,
48+
Set<String> entityClassNames) {
4749
return new Supplier<>() {
4850
@Override
4951
public ActiveResult get() {
@@ -53,14 +55,14 @@ public ActiveResult get() {
5355
PersistenceUnitUtil.persistenceUnitInactiveReasonDeactivated(puName, dataSourceName));
5456
}
5557

56-
if (dataSourceName.isPresent()) {
58+
if (entityClassNames.isEmpty() && dataSourceName.isPresent()) {
5759
// Persistence units are inactive when the corresponding datasource is inactive.
5860
var dataSourceBean = ReactiveDataSourceUtil.dataSourceInstance(dataSourceName.get()).getHandle().getBean();
5961
var dataSourceActive = dataSourceBean.checkActive();
6062
if (!dataSourceActive.value()) {
6163
return ActiveResult.inactive(
6264
String.format(Locale.ROOT,
63-
"Persistence unit '%s' was deactivated automatically because its datasource '%s' was deactivated.",
65+
"Persistence unit '%s' was deactivated automatically because it doesn't include any entity type and its datasource '%s' was deactivated.",
6466
puName,
6567
dataSourceName.get()),
6668
dataSourceActive);

0 commit comments

Comments
 (0)