From c2f452a87a3a8a8289401d0642d994b555791106 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 22 Mar 2021 13:50:40 +0100 Subject: [PATCH] Polish "Take JPA database action into account when setting ddlAuto" See gh-25129 --- .../orm/jpa/HibernateProperties.java | 11 ++-- .../HibernateJpaAutoConfigurationTests.java | 66 ++++++++++++------- 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateProperties.java index b7e95d9502..c8c5e2bd42 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateProperties.java @@ -130,14 +130,17 @@ public class HibernateProperties { } private String determineDdlAuto(Map existing, Supplier defaultDdlAuto) { - if (existing.get(AvailableSettings.HBM2DDL_DATABASE_ACTION) != null) { - return null; - } String ddlAuto = existing.get(AvailableSettings.HBM2DDL_AUTO); if (ddlAuto != null) { return ddlAuto; } - return (this.ddlAuto != null) ? this.ddlAuto : defaultDdlAuto.get(); + if (this.ddlAuto != null) { + return this.ddlAuto; + } + if (existing.get(AvailableSettings.HBM2DDL_DATABASE_ACTION) != null) { + return null; + } + return defaultDdlAuto.get(); } public static class Naming { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java index 252fc760d2..aaf0d64a25 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java @@ -373,47 +373,65 @@ class HibernateJpaAutoConfigurationTests extends AbstractJpaAutoConfigurationTes } @Test - void dataSourceSchemaCreatedEventFiredWhenDdlAutoPropertyIsSet() { - dataSourceSchemaCreatedEventFired("spring.jpa.hibernate.ddl-auto:create-drop", true); + void vendorPropertiesWithEmbeddedDatabaseAndNoDdlProperty() { + contextRunner().run(vendorProperties((vendorProperties) -> { + assertThat(vendorProperties).doesNotContainKeys(AvailableSettings.HBM2DDL_DATABASE_ACTION); + assertThat(vendorProperties.get(AvailableSettings.HBM2DDL_AUTO)).isEqualTo("create-drop"); + })); } @Test - void dataSourceSchemaCreatedEventNotFiredWhenDdlAutoPropertyIsSetToNone() { - dataSourceSchemaCreatedEventFired("spring.jpa.hibernate.ddl-auto:none", false); + void vendorPropertiesWithDdlAutoPropertyIsSet() { + contextRunner().withPropertyValues("spring.jpa.hibernate.ddl-auto=update") + .run(vendorProperties((vendorProperties) -> { + assertThat(vendorProperties).doesNotContainKeys(AvailableSettings.HBM2DDL_DATABASE_ACTION); + assertThat(vendorProperties.get(AvailableSettings.HBM2DDL_AUTO)).isEqualTo("update"); + })); } @Test - void dataSourceSchemaCreatedEventFiredWhenHibernateSpecificDdlAutoPropertyIsSet() { - dataSourceSchemaCreatedEventFired("spring.jpa.properties.hibernate.hbm2ddl.auto=create", true); + void vendorPropertiesWithDdlAutoPropertyAndHibernatePropertiesAreSet() { + contextRunner() + .withPropertyValues("spring.jpa.hibernate.ddl-auto=update", + "spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop") + .run(vendorProperties((vendorProperties) -> { + assertThat(vendorProperties).doesNotContainKeys(AvailableSettings.HBM2DDL_DATABASE_ACTION); + assertThat(vendorProperties.get(AvailableSettings.HBM2DDL_AUTO)).isEqualTo("create-drop"); + })); } @Test - void dataSourceSchemaCreatedEventNotFiredWhenHibernateSpecificDdlAutoPropertyIsSetToNone() { - dataSourceSchemaCreatedEventFired("spring.jpa.properties.hibernate.hbm2ddl.auto=none", false); + void vendorPropertiesWithDdlAutoPropertyIsSetToNone() { + contextRunner().withPropertyValues("spring.jpa.hibernate.ddl-auto=none") + .run(vendorProperties((vendorProperties) -> assertThat(vendorProperties).doesNotContainKeys( + AvailableSettings.HBM2DDL_DATABASE_ACTION, AvailableSettings.HBM2DDL_AUTO))); } @Test - void dataSourceSchemaCreatedEventFiredWhenJpaDbActionPropertyIsSet() { - dataSourceSchemaCreatedEventFired( - "spring.jpa.properties.javax.persistence.schema-generation.database.action=drop-and-create", true); + void vendorPropertiesWhenJpaDdlActionIsSet() { + contextRunner() + .withPropertyValues("spring.jpa.properties.javax.persistence.schema-generation.database.action=create") + .run(vendorProperties((vendorProperties) -> { + assertThat(vendorProperties.get(AvailableSettings.HBM2DDL_DATABASE_ACTION)).isEqualTo("create"); + assertThat(vendorProperties).doesNotContainKeys(AvailableSettings.HBM2DDL_AUTO); + })); } @Test - void dataSourceSchemaCreatedEventNotFiredWhenJpaDbActionPropertyIsSetToNone() { - dataSourceSchemaCreatedEventFired( - "spring.jpa.properties.javax.persistence.schema-generation.database.action=none", false); + void vendorPropertiesWhenBothDdlAutoPropertiesAreSet() { + contextRunner() + .withPropertyValues("spring.jpa.properties.javax.persistence.schema-generation.database.action=create", + "spring.jpa.hibernate.ddl-auto=create-only") + .run(vendorProperties((vendorProperties) -> { + assertThat(vendorProperties.get(AvailableSettings.HBM2DDL_DATABASE_ACTION)).isEqualTo("create"); + assertThat(vendorProperties.get(AvailableSettings.HBM2DDL_AUTO)).isEqualTo("create-only"); + })); } - private void dataSourceSchemaCreatedEventFired(String schemaGenerationPropertyWithValue, - boolean expectEventToBeFired) { - contextRunner().withUserConfiguration(JpaUsingApplicationListenerConfiguration.class) - .withPropertyValues("spring.datasource.initialization-mode=never", schemaGenerationPropertyWithValue) - .run((context) -> { - assertThat(context).hasNotFailed(); - assertThat(context.getBean(EventCapturingApplicationListener.class).events.stream() - .filter(DataSourceSchemaCreatedEvent.class::isInstance)) - .hasSize(expectEventToBeFired ? 1 : 0); - }); + private ContextConsumer vendorProperties( + Consumer> vendorProperties) { + return (context) -> vendorProperties + .accept(context.getBean(HibernateJpaConfiguration.class).getVendorProperties()); } @Test