Skip to content

Add property spring.data.jdbc.dialect #39941

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright 2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.springframework.boot.autoconfigure.data.jdbc;

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
* Configuration properties for Spring Data JDBC.
*
* @author Jens Schauder
* @since 3.3
*/
@ConfigurationProperties(prefix = "spring.data.jdbc")
public class JdbcDataProperties {

/**
* Dialect to use. By default, the dialect is determined by inspecting the database
* connection.
*/
private JdbcDatabaseDialect dialect;

public JdbcDatabaseDialect getDialect() {
return this.dialect;
}

public void setDialect(JdbcDatabaseDialect dialect) {
this.dialect = dialect;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/*
* Copyright 2012-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.springframework.boot.autoconfigure.data.jdbc;

import java.util.function.Supplier;

import org.springframework.data.jdbc.core.dialect.JdbcDb2Dialect;
import org.springframework.data.jdbc.core.dialect.JdbcMySqlDialect;
import org.springframework.data.jdbc.core.dialect.JdbcPostgresDialect;
import org.springframework.data.jdbc.core.dialect.JdbcSqlServerDialect;
import org.springframework.data.relational.core.dialect.Dialect;
import org.springframework.data.relational.core.dialect.H2Dialect;
import org.springframework.data.relational.core.dialect.HsqlDbDialect;
import org.springframework.data.relational.core.dialect.MariaDbDialect;
import org.springframework.data.relational.core.dialect.OracleDialect;

/**
* List of database dialects that can be configured in Boot for use with Spring Data JDBC.
*
* @author Jens Schauder
* @since 3.3
*/
public enum JdbcDatabaseDialect implements Supplier<Dialect> {

/**
* Provides an instance of {@link JdbcDb2Dialect}.
*/
DB2 {
@Override
public Dialect get() {
return JdbcDb2Dialect.INSTANCE;
}
},

/**
* Provides an instance of {@link H2Dialect}.
*/
H2 {
@Override
public Dialect get() {
return H2Dialect.INSTANCE;
}
},

/**
* Provides an instance of {@link HsqlDbDialect}.
*/
HSQL {
@Override
public Dialect get() {
return HsqlDbDialect.INSTANCE;
}
},

/**
* Provides an instance of {@link MariaDbDialect}.
*/
MARIA {
@Override
public Dialect get() {
return MariaDbDialect.INSTANCE;
}
},

/**
* Provides an instance of {@link JdbcMySqlDialect}.
*/
MYSQL {
@Override
public Dialect get() {
return JdbcMySqlDialect.INSTANCE;
}
},

/**
* Provides an instance of {@link OracleDialect}.
*/
ORACLE {
@Override
public Dialect get() {
return OracleDialect.INSTANCE;

}
},

/**
* Provides an instance of {@link JdbcPostgresDialect}.
*/
POSTGRESQL {
@Override
public Dialect get() {
return JdbcPostgresDialect.INSTANCE;
}
},

/**
* Provides an instance of {@link JdbcSqlServerDialect}.
*/
SQL_SERVER {
@Override
public Dialect get() {
return JdbcSqlServerDialect.INSTANCE;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.springframework.boot.autoconfigure.domain.EntityScanner;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand Down Expand Up @@ -59,6 +60,7 @@
* @author Andy Wilkinson
* @author Stephane Nicoll
* @author Mark Paluch
* @author Jens Schauder
* @since 2.1.0
* @see EnableJdbcRepositories
*/
Expand All @@ -67,6 +69,7 @@
@ConditionalOnClass({ NamedParameterJdbcOperations.class, AbstractJdbcConfiguration.class })
@ConditionalOnProperty(prefix = "spring.data.jdbc.repositories", name = "enabled", havingValue = "true",
matchIfMissing = true)
@EnableConfigurationProperties(JdbcDataProperties.class)
public class JdbcRepositoriesAutoConfiguration {

@Configuration(proxyBeanMethods = false)
Expand All @@ -82,8 +85,11 @@ static class SpringBootJdbcConfiguration extends AbstractJdbcConfiguration {

private final ApplicationContext applicationContext;

SpringBootJdbcConfiguration(ApplicationContext applicationContext) {
private final JdbcDataProperties properties;

SpringBootJdbcConfiguration(ApplicationContext applicationContext, JdbcDataProperties properties) {
this.applicationContext = applicationContext;
this.properties = properties;
}

@Override
Expand Down Expand Up @@ -141,6 +147,10 @@ public DataAccessStrategy dataAccessStrategyBean(NamedParameterJdbcOperations op
@Bean
@ConditionalOnMissingBean
public Dialect jdbcDialect(NamedParameterJdbcOperations operations) {
JdbcDatabaseDialect dialectEnum = this.properties.getDialect();
if (dialectEnum != null) {
return dialectEnum.get();
}
return super.jdbcDialect(operations);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.springframework.data.jdbc.core.convert.DataAccessStrategy;
import org.springframework.data.jdbc.core.convert.JdbcConverter;
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.core.dialect.JdbcPostgresDialect;
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
Expand All @@ -58,6 +59,7 @@
* @author Andy Wilkinson
* @author Stephane Nicoll
* @author Mark Paluch
* @author Jens Schauder
*/
class JdbcRepositoriesAutoConfigurationTests {

Expand Down Expand Up @@ -181,6 +183,16 @@ void allowsUserToDefineCustomDialect() {
allowsUserToDefineCustomBean(DialectConfiguration.class, Dialect.class, "customDialect");
}

@Test
void allowsConfigurationOfDialectByProperty() {
this.contextRunner.with(database())
.withPropertyValues("spring.data.jdbc.dialect=postgresql")
.withConfiguration(AutoConfigurations.of(JdbcTemplateAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class))
.withUserConfiguration(TestConfiguration.class)
.run((context) -> assertThat(context).hasSingleBean(JdbcPostgresDialect.class));
}

private void allowsUserToDefineCustomBean(Class<?> configuration, Class<?> beanType, String beanName) {
this.contextRunner.with(database())
.withConfiguration(AutoConfigurations.of(JdbcTemplateAutoConfiguration.class,
Expand Down