Commit 674b01cb authored by bono007's avatar bono007 Committed by Stephane Nicoll

Take JPA database action into account when setting ddlAuto

See gh-25129
parent e4fa39df
...@@ -129,7 +129,8 @@ class DataSourceInitializedPublisher implements BeanPostProcessor { ...@@ -129,7 +129,8 @@ class DataSourceInitializedPublisher implements BeanPostProcessor {
: "none"); : "none");
Map<String, Object> hibernate = this.hibernateProperties.determineHibernateProperties( Map<String, Object> hibernate = this.hibernateProperties.determineHibernateProperties(
this.jpaProperties.getProperties(), new HibernateSettings().ddlAuto(defaultDdlAuto)); this.jpaProperties.getProperties(), new HibernateSettings().ddlAuto(defaultDdlAuto));
return hibernate.containsKey("hibernate.hbm2ddl.auto"); return hibernate.containsKey("hibernate.hbm2ddl.auto") || !hibernate
.getOrDefault("javax.persistence.schema-generation.database.action", "none").equals("none");
} }
/** /**
......
...@@ -35,6 +35,7 @@ import org.springframework.util.StringUtils; ...@@ -35,6 +35,7 @@ import org.springframework.util.StringUtils;
* Configuration properties for Hibernate. * Configuration properties for Hibernate.
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Chris Bono
* @since 2.1.0 * @since 2.1.0
* @see JpaProperties * @see JpaProperties
*/ */
...@@ -129,6 +130,9 @@ public class HibernateProperties { ...@@ -129,6 +130,9 @@ public class HibernateProperties {
} }
private String determineDdlAuto(Map<String, String> existing, Supplier<String> defaultDdlAuto) { private String determineDdlAuto(Map<String, String> existing, Supplier<String> defaultDdlAuto) {
if (existing.get(AvailableSettings.HBM2DDL_DATABASE_ACTION) != null) {
return null;
}
String ddlAuto = existing.get(AvailableSettings.HBM2DDL_AUTO); String ddlAuto = existing.get(AvailableSettings.HBM2DDL_AUTO);
if (ddlAuto != null) { if (ddlAuto != null) {
return ddlAuto; return ddlAuto;
......
...@@ -91,6 +91,7 @@ import static org.mockito.Mockito.mock; ...@@ -91,6 +91,7 @@ import static org.mockito.Mockito.mock;
* @author Andy Wilkinson * @author Andy Wilkinson
* @author Kazuki Shimizu * @author Kazuki Shimizu
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Chris Bono
*/ */
class HibernateJpaAutoConfigurationTests extends AbstractJpaAutoConfigurationTests { class HibernateJpaAutoConfigurationTests extends AbstractJpaAutoConfigurationTests {
...@@ -371,6 +372,50 @@ class HibernateJpaAutoConfigurationTests extends AbstractJpaAutoConfigurationTes ...@@ -371,6 +372,50 @@ class HibernateJpaAutoConfigurationTests extends AbstractJpaAutoConfigurationTes
.run((context) -> assertThat(context).doesNotHaveBean(City.class)); .run((context) -> assertThat(context).doesNotHaveBean(City.class));
} }
@Test
void dataSourceSchemaCreatedEventFiredWhenDdlAutoPropertyIsSet() {
dataSourceSchemaCreatedEventFired("spring.jpa.hibernate.ddl-auto:create-drop", true);
}
@Test
void dataSourceSchemaCreatedEventNotFiredWhenDdlAutoPropertyIsSetToNone() {
dataSourceSchemaCreatedEventFired("spring.jpa.hibernate.ddl-auto:none", false);
}
@Test
void dataSourceSchemaCreatedEventFiredWhenHibernateSpecificDdlAutoPropertyIsSet() {
dataSourceSchemaCreatedEventFired("spring.jpa.properties.hibernate.hbm2ddl.auto=create", true);
}
@Test
void dataSourceSchemaCreatedEventNotFiredWhenHibernateSpecificDdlAutoPropertyIsSetToNone() {
dataSourceSchemaCreatedEventFired("spring.jpa.properties.hibernate.hbm2ddl.auto=none", false);
}
@Test
void dataSourceSchemaCreatedEventFiredWhenJpaDbActionPropertyIsSet() {
dataSourceSchemaCreatedEventFired(
"spring.jpa.properties.javax.persistence.schema-generation.database.action=drop-and-create", true);
}
@Test
void dataSourceSchemaCreatedEventNotFiredWhenJpaDbActionPropertyIsSetToNone() {
dataSourceSchemaCreatedEventFired(
"spring.jpa.properties.javax.persistence.schema-generation.database.action=none", false);
}
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);
});
}
@Test @Test
void withSyncBootstrappingAnApplicationListenerThatUsesJpaDoesNotTriggerABeanCurrentlyInCreationException() { void withSyncBootstrappingAnApplicationListenerThatUsesJpaDoesNotTriggerABeanCurrentlyInCreationException() {
contextRunner().withUserConfiguration(JpaUsingApplicationListenerConfiguration.class) contextRunner().withUserConfiguration(JpaUsingApplicationListenerConfiguration.class)
......
...@@ -44,6 +44,7 @@ import static org.mockito.Mockito.verify; ...@@ -44,6 +44,7 @@ import static org.mockito.Mockito.verify;
* *
* @author Stephane Nicoll * @author Stephane Nicoll
* @author Artsiom Yudovin * @author Artsiom Yudovin
* @author Chris Bono
*/ */
class HibernatePropertiesTests { class HibernatePropertiesTests {
...@@ -135,6 +136,19 @@ class HibernatePropertiesTests { ...@@ -135,6 +136,19 @@ class HibernatePropertiesTests {
.run(assertDefaultDdlAutoNotInvoked("create")); .run(assertDefaultDdlAutoNotInvoked("create"));
} }
@Test
void defaultDdlAutoIsNotInvokedAndDdlAutoIsNotSetIfJpaDbActionPropertyIsSet() {
this.contextRunner
.withPropertyValues(
"spring.jpa.properties.javax.persistence.schema-generation.database.action=drop-and-create")
.run(assertHibernateProperties((hibernateProperties) -> {
assertThat(hibernateProperties).doesNotContainKey(AvailableSettings.HBM2DDL_AUTO);
assertThat(hibernateProperties).containsEntry(AvailableSettings.HBM2DDL_DATABASE_ACTION,
"drop-and-create");
verify(this.ddlAutoSupplier, never()).get();
}));
}
private ContextConsumer<AssertableApplicationContext> assertDefaultDdlAutoNotInvoked(String expectedDdlAuto) { private ContextConsumer<AssertableApplicationContext> assertDefaultDdlAutoNotInvoked(String expectedDdlAuto) {
return assertHibernateProperties((hibernateProperties) -> { return assertHibernateProperties((hibernateProperties) -> {
assertThat(hibernateProperties).containsEntry(AvailableSettings.HBM2DDL_AUTO, expectedDdlAuto); assertThat(hibernateProperties).containsEntry(AvailableSettings.HBM2DDL_AUTO, expectedDdlAuto);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment