Skip to content

Commit

Permalink
Don't override spring.jpa.generate-ddl if `spring.jpa.properties.hi…
Browse files Browse the repository at this point in the history
…bernate.hbm2ddl.auto` is not set

Fix spring-projectsGH-40177
  • Loading branch information
quaff committed Apr 7, 2024
1 parent c3c82bd commit 3dec7b3
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2022 the original author or authors.
* 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.
Expand Down Expand Up @@ -36,6 +36,7 @@
*
* @author Stephane Nicoll
* @author Chris Bono
* @author Yanming Zhou
* @since 2.1.0
* @see JpaProperties
*/
Expand Down Expand Up @@ -85,11 +86,13 @@ private Map<String, Object> getAdditionalProperties(Map<String, String> existing
applyScanner(result);
getNaming().applyNamingStrategies(result);
String ddlAuto = determineDdlAuto(existing, settings::getDdlAuto);
if (StringUtils.hasText(ddlAuto) && !"none".equals(ddlAuto)) {
result.put(AvailableSettings.HBM2DDL_AUTO, ddlAuto);
}
else {
result.remove(AvailableSettings.HBM2DDL_AUTO);
if (StringUtils.hasText(ddlAuto)) {
if (!"none".equals(ddlAuto)) {
result.put(AvailableSettings.HBM2DDL_AUTO, ddlAuto);
}
else if (existing.containsKey(AvailableSettings.HBM2DDL_AUTO)) {
result.remove(AvailableSettings.HBM2DDL_AUTO);
}
}
Collection<HibernatePropertiesCustomizer> customizers = settings.getHibernatePropertiesCustomizers();
if (!ObjectUtils.isEmpty(customizers)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2023 the original author or authors.
* 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.
Expand Down Expand Up @@ -40,6 +40,7 @@
import org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy;
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.ManagedBeanSettings;
import org.hibernate.cfg.SchemaToolingSettings;
import org.hibernate.dialect.H2Dialect;
Expand All @@ -66,6 +67,8 @@
import org.springframework.boot.autoconfigure.orm.jpa.mapping.NonAnnotatedEntity;
import org.springframework.boot.autoconfigure.orm.jpa.test.City;
import org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration;
import org.springframework.boot.jdbc.SchemaManagement;
import org.springframework.boot.jdbc.SchemaManagementProvider;
import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy;
import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
import org.springframework.boot.sql.init.dependency.DependsOnDatabaseInitialization;
Expand All @@ -76,6 +79,7 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.orm.jpa.AbstractEntityManagerFactoryBean;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
Expand All @@ -98,6 +102,7 @@
* @author Stephane Nicoll
* @author Chris Bono
* @author Moritz Halbritter
* @author Yanming Zhou
*/
class HibernateJpaAutoConfigurationTests extends AbstractJpaAutoConfigurationTests {

Expand Down Expand Up @@ -182,6 +187,34 @@ void hibernateDialectIsSetWhenDatabasePlatformIsSet() {
.contains(entry("hibernate.dialect", databasePlatform))));
}

@Test
void jpaGenerateDdlIsUsedIfHibernateHbm2ddlAutoIsNotSet() {
contextRunner().withPropertyValues("spring.jpa.generate-ddl=true")
// return "none" instead of "create-drop"
// see HibernateDefaultDdlAutoProvider.getDefaultDdlAuto(DataSource)
.withBean(SchemaManagementProvider.class, () -> (dataSource) -> SchemaManagement.MANAGED)
.run(assertEntityManagerFactoryBean((adapter) -> assertThat(adapter.getJpaPropertyMap())
.containsEntry(AvailableSettings.HBM2DDL_AUTO, "update")));
}

@Test
void jpaGenerateDdlIsNotUsedIfHibernateHbm2ddlAutoIsSet() {
contextRunner()
.withPropertyValues("spring.jpa.generate-ddl=true", "spring.jpa.properties.hibernate.hbm2ddl.auto=none")
.run(assertEntityManagerFactoryBean((adapter) -> assertThat(adapter.getJpaPropertyMap())
.containsEntry(AvailableSettings.HBM2DDL_AUTO, "none")));
}

private ContextConsumer<AssertableApplicationContext> assertEntityManagerFactoryBean(
Consumer<AbstractEntityManagerFactoryBean> adapter) {
return (context) -> {
assertThat(context).hasSingleBean(JpaVendorAdapter.class);
assertThat(context).hasSingleBean(HibernateJpaVendorAdapter.class);
assertThat(context).hasSingleBean(AbstractEntityManagerFactoryBean.class);
adapter.accept(context.getBean(AbstractEntityManagerFactoryBean.class));
};
}

private ContextConsumer<AssertableApplicationContext> assertJpaVendorAdapter(
Consumer<HibernateJpaVendorAdapter> adapter) {
return (context) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ spring:
The line in the preceding example passes a value of `true` for the `hibernate.globally_quoted_identifiers` property to the Hibernate entity manager.

By default, the DDL execution (or validation) is deferred until the `ApplicationContext` has started.
There is also a `spring.jpa.generate-ddl` flag, but it is not used if Hibernate auto-configuration is active, because the `ddl-auto` settings are more fine-grained.
There is also a `spring.jpa.generate-ddl` flag, but it is not used if `spring.jpa.properties.hibernate.hbm2ddl.auto` is present, because the latter are more fine-grained.



Expand Down

0 comments on commit 3dec7b3

Please sign in to comment.