Skip to content

Commit 0a84ebf

Browse files
committed
Merge branch '3.4.x'
Closes gh-44626
2 parents 3fff2c8 + e06244d commit 0a84ebf

File tree

10 files changed

+359
-44
lines changed

10 files changed

+359
-44
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/orm/jpa/HibernateMetricsAutoConfigurationTests.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa;
1818

19-
import java.util.HashMap;
2019
import java.util.Map;
20+
import java.util.function.Function;
2121

2222
import javax.sql.DataSource;
2323

@@ -194,9 +194,10 @@ LocalContainerEntityManagerFactoryBean nonAutowire(DataSource ds) {
194194
}
195195

196196
private LocalContainerEntityManagerFactoryBean createSessionFactory(DataSource ds) {
197-
Map<String, String> jpaProperties = new HashMap<>();
198-
jpaProperties.put("hibernate.generate_statistics", "true");
199-
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), jpaProperties, null).dataSource(ds)
197+
Function<DataSource, Map<String, ?>> jpaPropertiesFactory = (dataSource) -> Map
198+
.of("hibernate.generate_statistics", "true");
199+
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), jpaPropertiesFactory, null)
200+
.dataSource(ds)
200201
.packages(PACKAGE_CLASSES)
201202
.build();
202203
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
145145
}
146146

147147
@Override
148-
protected Map<String, Object> getVendorProperties() {
149-
Supplier<String> defaultDdlMode = () -> this.defaultDdlAutoProvider.getDefaultDdlAuto(getDataSource());
148+
protected Map<String, Object> getVendorProperties(DataSource dataSource) {
149+
Supplier<String> defaultDdlMode = () -> this.defaultDdlAutoProvider.getDefaultDdlAuto(dataSource);
150150
return new LinkedHashMap<>(this.hibernateProperties.determineHibernateProperties(
151151
getProperties().getProperties(), new HibernateSettings().ddlAuto(defaultDdlMode)
152152
.hibernatePropertiesCustomizers(this.hibernatePropertiesCustomizers)));

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java

+22-5
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,15 @@ public JpaVendorAdapter jpaVendorAdapter() {
120120
public EntityManagerFactoryBuilder entityManagerFactoryBuilder(JpaVendorAdapter jpaVendorAdapter,
121121
ObjectProvider<PersistenceUnitManager> persistenceUnitManager,
122122
ObjectProvider<EntityManagerFactoryBuilderCustomizer> customizers) {
123-
EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder(jpaVendorAdapter, buildJpaProperties(),
124-
persistenceUnitManager.getIfAvailable());
123+
EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder(jpaVendorAdapter,
124+
this::buildJpaProperties, persistenceUnitManager.getIfAvailable());
125125
customizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
126126
return builder;
127127
}
128128

129-
private Map<String, ?> buildJpaProperties() {
129+
private Map<String, ?> buildJpaProperties(DataSource dataSource) {
130130
Map<String, Object> properties = new HashMap<>(this.properties.getProperties());
131-
Map<String, Object> vendorProperties = getVendorProperties();
131+
Map<String, Object> vendorProperties = getVendorProperties(dataSource);
132132
customizeVendorProperties(vendorProperties);
133133
properties.putAll(vendorProperties);
134134
return properties;
@@ -148,7 +148,24 @@ public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManager
148148

149149
protected abstract AbstractJpaVendorAdapter createJpaVendorAdapter();
150150

151-
protected abstract Map<String, Object> getVendorProperties();
151+
/**
152+
* Return the vendor-specific properties for the given {@link DataSource}.
153+
* @param dataSource the data source
154+
* @return the vendor properties
155+
* @since 3.4.4
156+
*/
157+
protected abstract Map<String, Object> getVendorProperties(DataSource dataSource);
158+
159+
/**
160+
* Return the vendor-specific properties.
161+
* @return the vendor properties
162+
* @deprecated since 3.4.4 for removal in 3.6.0 in favor of
163+
* {@link #getVendorProperties(DataSource)}
164+
*/
165+
@Deprecated(since = "3.4.4", forRemoval = true)
166+
protected Map<String, Object> getVendorProperties() {
167+
return getVendorProperties(getDataSource());
168+
}
152169

153170
/**
154171
* Customize vendor properties before they are used. Allows for post-processing (for

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/flyway/FlywayAutoConfigurationTests.java

+83-7
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,14 @@
6565
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.OracleFlywayConfigurationCustomizer;
6666
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.PostgresqlFlywayConfigurationCustomizer;
6767
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.SqlServerFlywayConfigurationCustomizer;
68+
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
6869
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
6970
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
7071
import org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails;
72+
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
7173
import org.springframework.boot.context.properties.EnableConfigurationProperties;
7274
import org.springframework.boot.jdbc.DataSourceBuilder;
75+
import org.springframework.boot.jdbc.EmbeddedDatabaseConnection;
7376
import org.springframework.boot.jdbc.SchemaManagement;
7477
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
7578
import org.springframework.boot.test.context.FilteredClassLoader;
@@ -489,6 +492,36 @@ void customFlywayWithJpa() {
489492
.run((context) -> assertThat(context).hasNotFailed());
490493
}
491494

495+
@Test
496+
@WithMetaInfPersistenceXmlResource
497+
void jpaApplyDdl() {
498+
this.contextRunner
499+
.withConfiguration(
500+
AutoConfigurations.of(DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class))
501+
.run((context) -> {
502+
Map<String, Object> jpaProperties = context.getBean(LocalContainerEntityManagerFactoryBean.class)
503+
.getJpaPropertyMap();
504+
assertThat(jpaProperties).doesNotContainKey("hibernate.hbm2ddl.auto");
505+
});
506+
}
507+
508+
@Test
509+
@WithMetaInfPersistenceXmlResource
510+
void jpaAndMultipleDataSourcesApplyDdl() {
511+
this.contextRunner.withConfiguration(AutoConfigurations.of(HibernateJpaAutoConfiguration.class))
512+
.withUserConfiguration(JpaWithMultipleDataSourcesConfiguration.class)
513+
.run((context) -> {
514+
LocalContainerEntityManagerFactoryBean normalEntityManagerFactoryBean = context
515+
.getBean("&normalEntityManagerFactory", LocalContainerEntityManagerFactoryBean.class);
516+
assertThat(normalEntityManagerFactoryBean.getJpaPropertyMap()).containsEntry("configured", "normal")
517+
.containsEntry("hibernate.hbm2ddl.auto", "create-drop");
518+
LocalContainerEntityManagerFactoryBean flywayEntityManagerFactoryBean = context
519+
.getBean("&flywayEntityManagerFactory", LocalContainerEntityManagerFactoryBean.class);
520+
assertThat(flywayEntityManagerFactoryBean.getJpaPropertyMap()).containsEntry("configured", "flyway")
521+
.doesNotContainKey("hibernate.hbm2ddl.auto");
522+
});
523+
}
524+
492525
@Test
493526
void customFlywayWithJdbc() {
494527
this.contextRunner
@@ -962,6 +995,13 @@ private ContextConsumer<AssertableApplicationContext> validateFlywayTeamsPropert
962995
};
963996
}
964997

998+
private static Map<String, ?> configureJpaProperties() {
999+
Map<String, Object> properties = new HashMap<>();
1000+
properties.put("configured", "manually");
1001+
properties.put("hibernate.transaction.jta.platform", NoJtaPlatform.INSTANCE);
1002+
return properties;
1003+
}
1004+
9651005
@Configuration(proxyBeanMethods = false)
9661006
static class FlywayDataSourceConfiguration {
9671007

@@ -1057,10 +1097,8 @@ FlywayMigrationInitializer customFlywayMigrationInitializer(Flyway flyway) {
10571097

10581098
@Bean
10591099
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource) {
1060-
Map<String, Object> properties = new HashMap<>();
1061-
properties.put("configured", "manually");
1062-
properties.put("hibernate.transaction.jta.platform", NoJtaPlatform.INSTANCE);
1063-
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), properties, null)
1100+
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), (ds) -> configureJpaProperties(),
1101+
null)
10641102
.dataSource(dataSource)
10651103
.build();
10661104
}
@@ -1083,14 +1121,52 @@ Flyway customFlyway() {
10831121

10841122
@Bean
10851123
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
1124+
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(),
1125+
(datasource) -> configureJpaProperties(), null)
1126+
.dataSource(this.dataSource)
1127+
.build();
1128+
}
1129+
1130+
}
1131+
1132+
@Configuration(proxyBeanMethods = false)
1133+
static class JpaWithMultipleDataSourcesConfiguration {
1134+
1135+
@Bean
1136+
@Primary
1137+
DataSource normalDataSource() {
1138+
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseConnection.HSQLDB.getType())
1139+
.generateUniqueName(true)
1140+
.build();
1141+
}
1142+
1143+
@Bean
1144+
@Primary
1145+
LocalContainerEntityManagerFactoryBean normalEntityManagerFactory(EntityManagerFactoryBuilder builder,
1146+
DataSource normalDataSource) {
10861147
Map<String, Object> properties = new HashMap<>();
1087-
properties.put("configured", "manually");
1148+
properties.put("configured", "normal");
10881149
properties.put("hibernate.transaction.jta.platform", NoJtaPlatform.INSTANCE);
1089-
return new EntityManagerFactoryBuilder(new HibernateJpaVendorAdapter(), properties, null)
1090-
.dataSource(this.dataSource)
1150+
return builder.dataSource(normalDataSource).properties(properties).build();
1151+
}
1152+
1153+
@Bean
1154+
@FlywayDataSource
1155+
DataSource flywayDataSource() {
1156+
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseConnection.HSQLDB.getType())
1157+
.generateUniqueName(true)
10911158
.build();
10921159
}
10931160

1161+
@Bean
1162+
LocalContainerEntityManagerFactoryBean flywayEntityManagerFactory(EntityManagerFactoryBuilder builder,
1163+
@FlywayDataSource DataSource flywayDataSource) {
1164+
Map<String, Object> properties = new HashMap<>();
1165+
properties.put("configured", "flyway");
1166+
properties.put("hibernate.transaction.jta.platform", NoJtaPlatform.INSTANCE);
1167+
return builder.dataSource(flywayDataSource).properties(properties).build();
1168+
}
1169+
10941170
}
10951171

10961172
@Configuration

0 commit comments

Comments
 (0)