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 GH-40177
  • Loading branch information
quaff committed Apr 7, 2024
1 parent c3c82bd commit 40d3749
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 8 deletions.
@@ -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 {
result.remove(AvailableSettings.HBM2DDL_AUTO);
}
}
Collection<HibernatePropertiesCustomizer> customizers = settings.getHibernatePropertiesCustomizers();
if (!ObjectUtils.isEmpty(customizers)) {
Expand Down
@@ -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 Down Expand Up @@ -76,6 +77,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 +100,7 @@
* @author Stephane Nicoll
* @author Chris Bono
* @author Moritz Halbritter
* @author Yanming Zhou
*/
class HibernateJpaAutoConfigurationTests extends AbstractJpaAutoConfigurationTests {

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

@Test
void jpaGenerateDdlIsUsedIfHibernateHbm2ddlAutoIsNotSet() {
contextRunner().withPropertyValues("spring.jpa.generate-ddl=true")
.run(assertEntityManagerFactoryBean((adapter) -> assertThat(adapter.getJpaPropertyMap())
.doesNotContainEntry(AvailableSettings.HBM2DDL_AUTO, "none")));
}

@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
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 40d3749

Please sign in to comment.