Skip to content

Commit d47f5b6

Browse files
committed
Enable named data source for hibernate reactive
* Changed error message / log to avoid using the default data source * Align FastBootHibernateReactivePersistenceProvider to FastBootHibernateReactivePersistenceProvider
1 parent 17ea8c0 commit d47f5b6

11 files changed

+117
-45
lines changed

docs/src/main/asciidoc/hibernate-reactive.adoc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,28 @@ public class SomeTest {
354354
----
355355
====
356356

357+
[[hr-named-datasource]]
358+
==== Named data sources
359+
360+
Hibernate Reactive supports having named data sources
361+
362+
[source,properties]
363+
.Example `{config-file}`
364+
----
365+
# datasource configuration
366+
quarkus.hibernate-orm.datasource = named-datasource
367+
quarkus.datasource."named-datasource".db-kind" = postgresql
368+
369+
# drop and create the database at startup (use `update` to only update the schema)
370+
%prod.quarkus.hibernate-orm.schema-management.strategy=drop-and-create
371+
%prod.quarkus.datasource."named-datasource".reactive" = true
372+
%prod.quarkus.datasource."named-datasource".username" = quarkus_test
373+
%prod.quarkus.datasource."named-datasource".password" = quarkus_test
374+
%prod.quarkus.datasource.reactive.url = vertx-reactive:postgresql://localhost/quarkus_test <1>
375+
----
376+
377+
When using a named data source, you need to set the `quarkus.hibernate-orm.datasource` property to the name of the data source.
378+
357379
[[hr-limitations]]
358380
== Limitations and other things you should know
359381

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,37 +152,43 @@ public void buildReactivePersistenceUnit(
152152
"Cannot use persistence.xml with Hibernate Reactive in Quarkus. Must use application.properties instead.");
153153
}
154154
}
155+
HibernateOrmConfigPersistenceUnit persistenceUnitConfig = hibernateOrmConfig.defaultPersistenceUnit();
156+
157+
String datasourceNameFromConf = persistenceUnitConfig.datasource().orElse(DataSourceUtil.DEFAULT_DATASOURCE_NAME);
155158

156-
// we only support the default pool for now
157159
DataSourceBuildTimeConfig defaultDataSourceBuildTimeConfig = dataSourcesBuildTimeConfig.dataSources()
158160
.get(DataSourceUtil.DEFAULT_DATASOURCE_NAME);
159161

162+
DataSourceBuildTimeConfig dataSourceBuildTimeConfig = dataSourcesBuildTimeConfig.dataSources()
163+
.get(datasourceNameFromConf);
164+
165+
Optional<String> datasourceName = Optional.of(datasourceNameFromConf);
160166
Optional<String> explicitDialect = hibernateOrmConfig.defaultPersistenceUnit().dialect().dialect();
161167
Optional<String> explicitDbMinVersion = defaultDataSourceBuildTimeConfig.dbVersion();
162168
Optional<String> dbKindOptional = DefaultDataSourceDbKindBuildItem.resolve(
163-
defaultDataSourceBuildTimeConfig.dbKind(),
169+
dataSourceBuildTimeConfig.dbKind(),
164170
defaultDataSourceDbKindBuildItems,
165171
defaultDataSourceBuildTimeConfig.devservices().enabled()
166172
.orElse(!dataSourcesBuildTimeConfig.hasNamedDataSources()),
167173
curateOutcomeBuildItem);
174+
Optional<String> dbVersion = dataSourceBuildTimeConfig.dbVersion();
168175

169176
if (dbKindOptional.isEmpty()) {
170177
throw new ConfigurationException(
171-
"The default datasource must be configured for Hibernate Reactive. Refer to https://quarkus.io/guides/datasource for guidance.",
178+
"The datasource must be configured for Hibernate Reactive. Refer to https://quarkus.io/guides/datasource for guidance.",
172179
Set.of("quarkus.datasource.db-kind", "quarkus.datasource.username",
173180
"quarkus.datasource.password"));
174181
}
175182

176183
// We only support Hibernate Reactive with a reactive data source, otherwise we don't configure the PU
177184
DataSourcesReactiveBuildTimeConfig.DataSourceReactiveOuterNamedBuildTimeConfig dataSourceReactiveBuildTimeConfig = dataSourcesReactiveBuildTimeConfig
178-
.dataSources().get(DataSourceUtil.DEFAULT_DATASOURCE_NAME);
185+
.dataSources().get(datasourceNameFromConf);
179186

180187
if (dataSourceReactiveBuildTimeConfig == null || !dataSourceReactiveBuildTimeConfig.reactive().enabled()) {
181-
LOG.warn("Hibernate Reactive is disabled because the default datasource is not reactive");
188+
LOG.warn("Hibernate Reactive is disabled because the datasource is not reactive");
182189
return;
183190
}
184191

185-
HibernateOrmConfigPersistenceUnit persistenceUnitConfig = hibernateOrmConfig.defaultPersistenceUnit();
186192
QuarkusPersistenceUnitDescriptor reactivePU = generateReactivePersistenceUnit(
187193
hibernateOrmConfig, index, persistenceUnitConfig, jpaModel,
188194
dbKindOptional, explicitDialect, explicitDbMinVersion, applicationArchivesBuildItem,
@@ -201,8 +207,10 @@ public void buildReactivePersistenceUnit(
201207
// - we don't support starting Hibernate Reactive from a persistence.xml
202208
// - we don't support Hibernate Envers with Hibernate Reactive
203209
persistenceUnitDescriptors.produce(new PersistenceUnitDescriptorBuildItem(reactivePU,
204-
new RecordedConfig(Optional.of(DataSourceUtil.DEFAULT_DATASOURCE_NAME),
205-
dbKindOptional, Optional.empty(),
210+
new RecordedConfig(
211+
datasourceName,
212+
dbKindOptional,
213+
dbVersion,
206214
persistenceUnitConfig.dialect().dialect(),
207215
io.quarkus.hibernate.orm.runtime.migration.MultiTenancyStrategy.NONE,
208216
hibernateOrmConfig.database().ormCompatibilityVersion(),
Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package io.quarkus.hibernate.reactive.compatibility;
22

3-
import static org.assertj.core.api.Assertions.assertThat;
4-
53
import java.util.List;
64

7-
import org.junit.jupiter.api.Assertions;
85
import org.junit.jupiter.api.Test;
96
import org.junit.jupiter.api.extension.RegisterExtension;
107

118
import io.quarkus.builder.Version;
129
import io.quarkus.hibernate.reactive.entities.Hero;
1310
import io.quarkus.maven.dependency.Dependency;
14-
import io.quarkus.runtime.configuration.ConfigurationException;
1511
import io.quarkus.test.QuarkusUnitTest;
12+
import io.quarkus.test.vertx.RunOnVertxContext;
13+
import io.quarkus.test.vertx.UniAsserter;
1614

1715
public class ORMReactiveCompatbilityNamedDataSourceBothUnitTest extends CompatibilityUnitTestBase {
1816

@@ -30,19 +28,16 @@ public class ORMReactiveCompatbilityNamedDataSourceBothUnitTest extends Compatib
3028
.overrideConfigKey("quarkus.datasource.\"named-datasource\".reactive", "true")
3129
.overrideConfigKey("quarkus.datasource.\"named-datasource\".db-kind", POSTGRES_KIND)
3230
.overrideConfigKey("quarkus.datasource.\"named-datasource\".username", USERNAME_PWD)
33-
.overrideConfigKey("quarkus.datasource.\"named-datasource\".password", USERNAME_PWD)
34-
.assertException(t -> assertThat(t)
35-
.isInstanceOf(ConfigurationException.class)
36-
.hasMessageContainingAll(
37-
// Hibernate Reactive doesn't support explicitly setting the datasource (yet),
38-
// so it will just notice the default datasource is not configured!
39-
"The default datasource must be configured for Hibernate Reactive",
40-
"Refer to https://quarkus.io/guides/datasource for guidance."));
31+
.overrideConfigKey("quarkus.datasource.\"named-datasource\".password", USERNAME_PWD);
4132

4233
@Test
43-
public void test() {
44-
// deployment exception should happen first
45-
Assertions.fail();
34+
@RunOnVertxContext
35+
public void test(UniAsserter uniAsserter) {
36+
testReactiveWorks(uniAsserter);
4637
}
4738

39+
@Test
40+
public void testBlocking() {
41+
testBlockingWorks();
42+
}
4843
}

extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/compatibility/ORMReactiveCompatbilityNamedDataSourceNamedPersistenceUnitBothUnitTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ public class ORMReactiveCompatbilityNamedDataSourceNamedPersistenceUnitBothUnitT
3535
.assertException(t -> assertThat(t)
3636
.isInstanceOf(ConfigurationException.class)
3737
.hasMessageContainingAll(
38-
// Hibernate Reactive doesn't support explicitly setting the datasource (yet),
39-
// so it will just notice the default datasource is not configured!
40-
"The default datasource must be configured for Hibernate Reactive",
38+
// Hibernate Reactive doesn't support named persistence unit
39+
// so it will just notice the datasource is not configured!
40+
// We probably need a better error message when named persistence unit is supported
41+
"The datasource must be configured for Hibernate Reactive",
4142
"Refer to https://quarkus.io/guides/datasource for guidance."));
4243

4344
@Test
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package io.quarkus.hibernate.reactive.compatibility;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import jakarta.inject.Inject;
6+
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.extension.RegisterExtension;
9+
10+
import io.quarkus.hibernate.reactive.entities.Hero;
11+
import io.quarkus.reactive.datasource.ReactiveDataSource;
12+
import io.quarkus.test.QuarkusUnitTest;
13+
import io.quarkus.test.vertx.RunOnVertxContext;
14+
import io.quarkus.test.vertx.UniAsserter;
15+
import io.vertx.sqlclient.Pool;
16+
17+
public class ORMReactiveCompatbilityNamedDataSourceReactiveUnitTest extends CompatibilityUnitTestBase {
18+
19+
@RegisterExtension
20+
static final QuarkusUnitTest config = new QuarkusUnitTest()
21+
.withApplicationRoot((jar) -> jar
22+
.addClasses(Hero.class)
23+
.addAsResource("complexMultilineImports.sql", "import.sql"))
24+
.withConfigurationResource("application-unittest-onlyreactive-named.properties")
25+
.overrideConfigKey("quarkus.hibernate-orm.schema-management.strategy", SCHEMA_MANAGEMENT_STRATEGY)
26+
.overrideConfigKey("quarkus.hibernate-orm.datasource", "named-datasource")
27+
.overrideConfigKey("quarkus.datasource.\"named-datasource\".reactive", "true")
28+
.overrideConfigKey("quarkus.datasource.\"named-datasource\".db-kind", POSTGRES_KIND)
29+
.overrideConfigKey("quarkus.datasource.\"named-datasource\".username", USERNAME_PWD)
30+
.overrideConfigKey("quarkus.datasource.\"named-datasource\".password", USERNAME_PWD);
31+
32+
@Inject
33+
@ReactiveDataSource("named-datasource")
34+
Pool pool;
35+
36+
@Test
37+
@RunOnVertxContext
38+
public void test(UniAsserter uniAsserter) {
39+
testReactiveWorks(uniAsserter);
40+
assertThat(pool).isNotNull();
41+
}
42+
43+
}

extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/config/datasource/EntitiesInDefaultPUWithExplicitDatasourceConfigActiveFalseTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.quarkus.hibernate.reactive.config.datasource;
22

3+
import static io.quarkus.datasource.common.runtime.DatabaseKind.POSTGRESQL;
34
import static org.assertj.core.api.Assertions.assertThat;
45

56
import org.junit.jupiter.api.Assertions;
@@ -21,13 +22,11 @@ public class EntitiesInDefaultPUWithExplicitDatasourceConfigActiveFalseTest {
2122
.overrideConfigKey("quarkus.datasource.\"ds-1\".active", "false")
2223
// We need at least one build-time property for the datasource,
2324
// otherwise it's considered unconfigured at build time...
24-
.overrideConfigKey("quarkus.datasource.\"ds-1\".db-kind", "h2")
25+
.overrideConfigKey("quarkus.datasource.\"ds-1\".db-kind", POSTGRESQL)
2526
.assertException(t -> assertThat(t)
2627
.isInstanceOf(ConfigurationException.class)
2728
.hasMessageContainingAll(
28-
// Hibernate Reactive doesn't support explicitly setting the datasource (yet),
29-
// so it will just notice the default datasource is not configured!
30-
"The default datasource must be configured for Hibernate Reactive",
29+
"Datasource 'ds-1' was deactivated through configuration properties. To activate the datasource, set configuration property 'quarkus.datasource.\"ds-1\".active' to 'true' and configure datasource 'ds-1'",
3130
"Refer to https://quarkus.io/guides/datasource for guidance."));
3231

3332
@Test

extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/config/datasource/EntitiesInDefaultPUWithExplicitDatasourceConfigUrlMissingTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.quarkus.hibernate.reactive.config.datasource;
22

3+
import static io.quarkus.datasource.common.runtime.DatabaseKind.POSTGRESQL;
34
import static org.assertj.core.api.Assertions.assertThat;
45

56
import org.junit.jupiter.api.Assertions;
@@ -22,13 +23,13 @@ public class EntitiesInDefaultPUWithExplicitDatasourceConfigUrlMissingTest {
2223
.overrideConfigKey("quarkus.devservices.enabled", "false")
2324
// We need at least one build-time property for the datasource,
2425
// otherwise it's considered unconfigured at build time...
25-
.overrideConfigKey("quarkus.datasource.ds-1.db-kind", "h2")
26+
.overrideConfigKey("quarkus.datasource.ds-1.db-kind", POSTGRESQL)
2627
.assertException(t -> assertThat(t)
2728
.isInstanceOf(ConfigurationException.class)
2829
.hasMessageContainingAll(
2930
// Hibernate Reactive doesn't support explicitly setting the datasource (yet),
30-
// so it will just notice the default datasource is not configured!
31-
"The default datasource must be configured for Hibernate Reactive",
31+
// so it will just notice the datasource is not configured!
32+
"Datasource 'ds-1' was deactivated automatically because its URL is not set. To activate the datasource, set configuration property 'quarkus.datasource.\"ds-1\".reactive.url'",
3233
"Refer to https://quarkus.io/guides/datasource for guidance."));
3334

3435
@Test

extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/config/datasource/EntitiesInDefaultPUWithExplicitDatasourceMissingTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public class EntitiesInDefaultPUWithExplicitDatasourceMissingTest {
3131
.isInstanceOf(ConfigurationException.class)
3232
.hasMessageContainingAll(
3333
// Hibernate Reactive doesn't support explicitly setting the datasource (yet),
34-
// so it will just notice the default datasource is not configured!
35-
"The default datasource must be configured for Hibernate Reactive",
34+
// so it will just notice the datasource is not configured!
35+
"The datasource must be configured for Hibernate Reactive",
3636
"Refer to https://quarkus.io/guides/datasource for guidance."));
3737

3838
@Test

extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/config/datasource/EntitiesInDefaultPUWithImplicitDatasourceConfigUrlMissingTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class EntitiesInDefaultPUWithImplicitDatasourceConfigUrlMissingTest {
3030
.assertException(t -> assertThat(t)
3131
.isInstanceOf(ConfigurationException.class)
3232
.hasMessageContainingAll(
33-
"The default datasource must be configured for Hibernate Reactive",
33+
"The datasource must be configured for Hibernate Reactive",
3434
"Refer to https://quarkus.io/guides/datasource for guidance."));
3535

3636
@Test
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
quarkus.datasource."named-datasource".reactive.url=${postgres.reactive.url}

0 commit comments

Comments
 (0)