Skip to content

Commit 140ba6b

Browse files
allow disabling JPA per datasource (#1487)
Currently you can only disable JPA for all datasources, but you might want to use JPA for one datasource but not the other. This PR adds the ability to disable JPA for a particular datasource. --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
1 parent 7199159 commit 140ba6b

File tree

4 files changed

+36
-2
lines changed

4 files changed

+36
-2
lines changed

.github/workflows/gradle.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ jobs:
4545
fetch-depth: 0
4646

4747
- name: "🔧 Setup GraalVM CE"
48-
uses: graalvm/[email protected].3
48+
uses: graalvm/[email protected].5
4949
with:
5050
distribution: 'graalvm'
5151
java-version: ${{ matrix.java }}

hibernate-jpa/src/main/java/io/micronaut/configuration/hibernate/jpa/JpaConfiguration.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
* @since 1.0
5050
*/
5151
@EachProperty(value = JpaConfiguration.PREFIX, primary = JpaConfiguration.PRIMARY)
52-
public class JpaConfiguration {
52+
public class JpaConfiguration implements Toggleable {
5353
public static final String PREFIX = "jpa";
5454
public static final String PRIMARY = "default";
5555

@@ -62,6 +62,7 @@ public class JpaConfiguration {
6262

6363
private boolean compileTimeHibernateProxies;
6464
private boolean reactive;
65+
private boolean enabled = true;
6566

6667
/**
6768
* @param applicationContext The application context
@@ -97,6 +98,19 @@ protected JpaConfiguration(@Parameter String name,
9798
this.integrator = integrator;
9899
}
99100

101+
@Override
102+
public boolean isEnabled() {
103+
return this.enabled;
104+
}
105+
106+
/**
107+
* Set whether the JPA integration for the datasource is enabled.
108+
* @param enabled True if it is enabled
109+
*/
110+
public void setEnabled(boolean enabled) {
111+
this.enabled = enabled;
112+
}
113+
100114
/**
101115
* @return The configuration name
102116
*/

hibernate-jpa/src/main/java/io/micronaut/configuration/hibernate/jpa/conf/SessionFactoryPerDataSourceFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import io.micronaut.context.annotation.Primary;
2929
import io.micronaut.context.annotation.Requires;
3030
import io.micronaut.context.env.Environment;
31+
import io.micronaut.context.exceptions.DisabledBeanException;
3132
import io.micronaut.core.annotation.Internal;
3233
import io.micronaut.core.annotation.Nullable;
3334
import io.micronaut.core.annotation.TypeHint;
@@ -71,6 +72,8 @@ ServiceRegistry buildHibernateStandardServiceRegistry(@Parameter @Nullable JpaCo
7172
@Parameter String name) {
7273
if (jpaConfiguration == null) {
7374
jpaConfiguration = defaultJpaConfiguration.copy(name);
75+
} else if (!jpaConfiguration.isEnabled()) {
76+
throw new DisabledBeanException("JPA configuration for datasource [" + name + "] is disabled");
7477
}
7578
return super.buildHibernateStandardServiceRegistry(jpaConfiguration);
7679
}

hibernate-jpa/src/test/groovy/io/micronaut/configuration/hibernate/jpa/datasources/CurrentSessionWithMultipleDataSourcesSpec.groovy

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,23 @@ class CurrentSessionWithMultipleDataSourcesSpec extends Specification {
8181
context.close()
8282
}
8383

84+
void "test an application that defines multiple data sources - one disabled"() {
85+
when:
86+
def context = ApplicationContext.run(
87+
'datasources.default.name': 'db1',
88+
'datasources.db2.url': 'jdbc:h2:mem:db2;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE',
89+
'datasources.abc.url': 'jdbc:h2:mem:db2;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE',
90+
'jpa.db2.enabled': false,
91+
)
92+
then:
93+
context.findBean(SessionFactory, Qualifiers.byName("default")).isPresent()
94+
!context.findBean(SessionFactory, Qualifiers.byName("db2")).isPresent()
95+
context.findBean(SessionFactory, Qualifiers.byName("abc")).isPresent()
96+
!context.findBean(SessionFactory, Qualifiers.byName("unknown")).isPresent()
97+
cleanup:
98+
context.close()
99+
}
100+
84101
void "test parallel init of non-default SessionFactory with missing entities"() {
85102
when:
86103
def context = ApplicationContext.run(

0 commit comments

Comments
 (0)