Skip to content

Commit c22e9a5

Browse files
committed
Make sure that JpaProperties does not have Hibernate imports
This commit removes Hibernate imports from JpaProperties so that it can be used with another JPA provider. This commit is a breaking change for an internal, yet public class used to transmit customizations provided by the user. It does not change the external functionality though: naming strategies defined as bean are still taken into account and a customizer has a chance to override it regardless. Closes gh-13043
1 parent 6556bb2 commit c22e9a5

File tree

5 files changed

+171
-130
lines changed

5 files changed

+171
-130
lines changed

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

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Collection;
2020
import java.util.Collections;
2121
import java.util.LinkedHashMap;
22+
import java.util.LinkedList;
2223
import java.util.List;
2324
import java.util.Map;
2425
import java.util.function.Supplier;
@@ -84,10 +85,6 @@ class HibernateJpaConfiguration extends JpaBaseConfiguration {
8485

8586
private DataSourcePoolMetadataProvider poolMetadataProvider;
8687

87-
private final PhysicalNamingStrategy physicalNamingStrategy;
88-
89-
private final ImplicitNamingStrategy implicitNamingStrategy;
90-
9188
private final List<HibernatePropertiesCustomizer> hibernatePropertiesCustomizers;
9289

9390
HibernateJpaConfiguration(DataSource dataSource, JpaProperties jpaProperties,
@@ -104,10 +101,23 @@ class HibernateJpaConfiguration extends JpaBaseConfiguration {
104101
providers.getIfAvailable(Collections::emptyList));
105102
this.poolMetadataProvider = new CompositeDataSourcePoolMetadataProvider(
106103
metadataProviders.getIfAvailable());
107-
this.physicalNamingStrategy = physicalNamingStrategy.getIfAvailable();
108-
this.implicitNamingStrategy = implicitNamingStrategy.getIfAvailable();
109-
this.hibernatePropertiesCustomizers = hibernatePropertiesCustomizers
110-
.getIfAvailable(() -> Collections.emptyList());
104+
this.hibernatePropertiesCustomizers = determineHibernatePropertiesCustomizers(
105+
physicalNamingStrategy.getIfAvailable(),
106+
implicitNamingStrategy.getIfAvailable(),
107+
hibernatePropertiesCustomizers.getIfAvailable(Collections::emptyList));
108+
}
109+
110+
private List<HibernatePropertiesCustomizer> determineHibernatePropertiesCustomizers(
111+
PhysicalNamingStrategy physicalNamingStrategy,
112+
ImplicitNamingStrategy implicitNamingStrategy,
113+
List<HibernatePropertiesCustomizer> hibernatePropertiesCustomizers) {
114+
if (physicalNamingStrategy != null || implicitNamingStrategy != null) {
115+
LinkedList<HibernatePropertiesCustomizer> customizers = new LinkedList<>(hibernatePropertiesCustomizers);
116+
customizers.addFirst(new NamingStrategiesHibernatePropertiesCustomizer(
117+
physicalNamingStrategy, implicitNamingStrategy));
118+
return customizers;
119+
}
120+
return hibernatePropertiesCustomizers;
111121
}
112122

113123
@Override
@@ -121,8 +131,6 @@ protected Map<String, Object> getVendorProperties() {
121131
.getDefaultDdlAuto(getDataSource());
122132
return new LinkedHashMap<>(getProperties()
123133
.getHibernateProperties(new HibernateSettings().ddlAuto(defaultDdlMode)
124-
.implicitNamingStrategy(this.implicitNamingStrategy)
125-
.physicalNamingStrategy(this.physicalNamingStrategy)
126134
.hibernatePropertiesCustomizers(
127135
this.hibernatePropertiesCustomizers)));
128136
}
@@ -232,4 +240,32 @@ private Object getJtaPlatformManager(String[] candidates) {
232240
throw new IllegalStateException("Could not configure JTA platform");
233241
}
234242

243+
private static class NamingStrategiesHibernatePropertiesCustomizer
244+
implements HibernatePropertiesCustomizer {
245+
246+
private final PhysicalNamingStrategy physicalNamingStrategy;
247+
248+
private final ImplicitNamingStrategy implicitNamingStrategy;
249+
250+
NamingStrategiesHibernatePropertiesCustomizer(
251+
PhysicalNamingStrategy physicalNamingStrategy,
252+
ImplicitNamingStrategy implicitNamingStrategy) {
253+
this.physicalNamingStrategy = physicalNamingStrategy;
254+
this.implicitNamingStrategy = implicitNamingStrategy;
255+
}
256+
257+
@Override
258+
public void customize(Map<String, Object> hibernateProperties) {
259+
if (this.physicalNamingStrategy != null) {
260+
hibernateProperties.put("hibernate.physical_naming_strategy",
261+
this.physicalNamingStrategy);
262+
}
263+
if (this.implicitNamingStrategy != null) {
264+
hibernateProperties.put("hibernate.implicit_naming_strategy",
265+
this.implicitNamingStrategy);
266+
}
267+
}
268+
269+
}
270+
235271
}

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

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@
2020
import java.util.Collection;
2121
import java.util.function.Supplier;
2222

23-
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
24-
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
25-
2623
/**
2724
* Settings to apply when configuring Hibernate.
2825
*
@@ -33,10 +30,6 @@ public class HibernateSettings {
3330

3431
private Supplier<String> ddlAuto;
3532

36-
private ImplicitNamingStrategy implicitNamingStrategy;
37-
38-
private PhysicalNamingStrategy physicalNamingStrategy;
39-
4033
private Collection<HibernatePropertiesCustomizer> hibernatePropertiesCustomizers;
4134

4235
public HibernateSettings ddlAuto(Supplier<String> ddlAuto) {
@@ -60,26 +53,6 @@ public String getDdlAuto() {
6053
return (this.ddlAuto != null ? this.ddlAuto.get() : null);
6154
}
6255

63-
public HibernateSettings implicitNamingStrategy(
64-
ImplicitNamingStrategy implicitNamingStrategy) {
65-
this.implicitNamingStrategy = implicitNamingStrategy;
66-
return this;
67-
}
68-
69-
public ImplicitNamingStrategy getImplicitNamingStrategy() {
70-
return this.implicitNamingStrategy;
71-
}
72-
73-
public HibernateSettings physicalNamingStrategy(
74-
PhysicalNamingStrategy physicalNamingStrategy) {
75-
this.physicalNamingStrategy = physicalNamingStrategy;
76-
return this;
77-
}
78-
79-
public PhysicalNamingStrategy getPhysicalNamingStrategy() {
80-
return this.physicalNamingStrategy;
81-
}
82-
8356
public HibernateSettings hibernatePropertiesCustomizers(
8457
Collection<HibernatePropertiesCustomizer> hibernatePropertiesCustomizers) {
8558
this.hibernatePropertiesCustomizers = new ArrayList<>(

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

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@
2525

2626
import javax.sql.DataSource;
2727

28-
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
29-
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
30-
3128
import org.springframework.boot.context.properties.ConfigurationProperties;
3229
import org.springframework.orm.jpa.vendor.Database;
3330
import org.springframework.util.ObjectUtils;
@@ -215,9 +212,7 @@ private Map<String, Object> getAdditionalProperties(Map<String, String> existing
215212
HibernateSettings settings) {
216213
Map<String, Object> result = new HashMap<>(existing);
217214
applyNewIdGeneratorMappings(result);
218-
getNaming().applyNamingStrategies(result,
219-
settings.getImplicitNamingStrategy(),
220-
settings.getPhysicalNamingStrategy());
215+
getNaming().applyNamingStrategies(result);
221216
String ddlAuto = determineDdlAuto(existing, settings::getDdlAuto);
222217
if (StringUtils.hasText(ddlAuto) && !"none".equals(ddlAuto)) {
223218
result.put("hibernate.hbm2ddl.auto", ddlAuto);
@@ -292,17 +287,11 @@ public void setPhysicalStrategy(String physicalStrategy) {
292287
this.physicalStrategy = physicalStrategy;
293288
}
294289

295-
private void applyNamingStrategies(Map<String, Object> properties,
296-
ImplicitNamingStrategy implicitStrategyBean,
297-
PhysicalNamingStrategy physicalStrategyBean) {
290+
private void applyNamingStrategies(Map<String, Object> properties) {
298291
applyNamingStrategy(properties, "hibernate.implicit_naming_strategy",
299-
implicitStrategyBean != null ? implicitStrategyBean
300-
: this.implicitStrategy,
301-
DEFAULT_IMPLICIT_STRATEGY);
292+
this.implicitStrategy, DEFAULT_IMPLICIT_STRATEGY);
302293
applyNamingStrategy(properties, "hibernate.physical_naming_strategy",
303-
physicalStrategyBean != null ? physicalStrategyBean
304-
: this.physicalStrategy,
305-
DEFAULT_PHYSICAL_STRATEGY);
294+
this.physicalStrategy, DEFAULT_PHYSICAL_STRATEGY);
306295
}
307296

308297
private void applyNamingStrategy(Map<String, Object> properties, String key,

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfigurationTests.java

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import javax.transaction.UserTransaction;
3434

3535
import com.zaxxer.hikari.HikariDataSource;
36+
import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
37+
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
3638
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform;
3739
import org.junit.Test;
3840

@@ -47,7 +49,10 @@
4749
import org.springframework.boot.autoconfigure.orm.jpa.mapping.NonAnnotatedEntity;
4850
import org.springframework.boot.autoconfigure.orm.jpa.test.City;
4951
import org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration;
52+
import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy;
5053
import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
54+
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;
55+
import org.springframework.context.annotation.Bean;
5156
import org.springframework.context.annotation.Configuration;
5257
import org.springframework.orm.jpa.JpaTransactionManager;
5358
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
@@ -268,6 +273,83 @@ public void customResourceMapping() {
268273
});
269274
}
270275

276+
@Test
277+
public void physicalNamingStrategyCanBeUsed() {
278+
contextRunner()
279+
.withUserConfiguration(TestPhysicalNamingStrategyConfiguration.class)
280+
.run((context) -> {
281+
Map<String, Object> hibernateProperties = context.getBean(
282+
HibernateJpaConfiguration.class).getVendorProperties();
283+
assertThat(hibernateProperties).contains(
284+
entry("hibernate.physical_naming_strategy",
285+
context.getBean("testPhysicalNamingStrategy")));
286+
assertThat(hibernateProperties)
287+
.doesNotContainKeys("hibernate.ejb.naming_strategy");
288+
});
289+
}
290+
291+
@Test
292+
public void implicitNamingStrategyCanBeUsed() {
293+
contextRunner()
294+
.withUserConfiguration(TestImplicitNamingStrategyConfiguration.class)
295+
.run((context) -> {
296+
Map<String, Object> hibernateProperties = context.getBean(
297+
HibernateJpaConfiguration.class).getVendorProperties();
298+
assertThat(hibernateProperties).contains(
299+
entry("hibernate.implicit_naming_strategy",
300+
context.getBean("testImplicitNamingStrategy")));
301+
assertThat(hibernateProperties)
302+
.doesNotContainKeys("hibernate.ejb.naming_strategy");
303+
});
304+
}
305+
306+
@Test
307+
public void namingStrategyInstancesTakePrecedenceOverNamingStrategyProperties() {
308+
contextRunner()
309+
.withUserConfiguration(TestPhysicalNamingStrategyConfiguration.class,
310+
TestImplicitNamingStrategyConfiguration.class)
311+
.withPropertyValues(
312+
"spring.jpa.hibernate.naming.physical-strategy:com.example.Physical",
313+
"spring.jpa.hibernate.naming.implicit-strategy:com.example.Implicit")
314+
.run((context) -> {
315+
Map<String, Object> hibernateProperties = context.getBean(
316+
HibernateJpaConfiguration.class).getVendorProperties();
317+
assertThat(hibernateProperties).contains(
318+
entry("hibernate.physical_naming_strategy",
319+
context.getBean("testPhysicalNamingStrategy")),
320+
entry("hibernate.implicit_naming_strategy",
321+
context.getBean("testImplicitNamingStrategy")));
322+
assertThat(hibernateProperties)
323+
.doesNotContainKeys("hibernate.ejb.naming_strategy");
324+
});
325+
}
326+
327+
@Test
328+
public void hibernatePropertiesCustomizerTakePrecedenceOverStrategyInstancesAndNamingStrategyProperties() {
329+
contextRunner()
330+
.withUserConfiguration(
331+
TestHibernatePropertiesCustomizerConfiguration.class,
332+
TestPhysicalNamingStrategyConfiguration.class,
333+
TestImplicitNamingStrategyConfiguration.class)
334+
.withPropertyValues(
335+
"spring.jpa.hibernate.naming.physical-strategy:com.example.Physical",
336+
"spring.jpa.hibernate.naming.implicit-strategy:com.example.Implicit")
337+
.run((context) -> {
338+
Map<String, Object> hibernateProperties = context.getBean(
339+
HibernateJpaConfiguration.class).getVendorProperties();
340+
TestHibernatePropertiesCustomizerConfiguration configuration = context.getBean(
341+
TestHibernatePropertiesCustomizerConfiguration.class);
342+
assertThat(hibernateProperties).contains(
343+
entry("hibernate.physical_naming_strategy",
344+
configuration.physicalNamingStrategy),
345+
entry("hibernate.implicit_naming_strategy",
346+
configuration.implicitNamingStrategy));
347+
assertThat(hibernateProperties)
348+
.doesNotContainKeys("hibernate.ejb.naming_strategy");
349+
});
350+
}
351+
352+
271353
@Configuration
272354
@TestAutoConfigurationPackage(City.class)
273355
static class TestInitializedJpaConfiguration {
@@ -288,6 +370,45 @@ public void validateDataSourceIsInitialized(
288370

289371
}
290372

373+
@Configuration
374+
static class TestImplicitNamingStrategyConfiguration {
375+
376+
@Bean
377+
public ImplicitNamingStrategy testImplicitNamingStrategy() {
378+
return new SpringImplicitNamingStrategy();
379+
}
380+
381+
}
382+
383+
@Configuration
384+
static class TestPhysicalNamingStrategyConfiguration {
385+
386+
@Bean
387+
public PhysicalNamingStrategy testPhysicalNamingStrategy() {
388+
return new SpringPhysicalNamingStrategy();
389+
}
390+
391+
}
392+
393+
@Configuration
394+
static class TestHibernatePropertiesCustomizerConfiguration {
395+
396+
private final PhysicalNamingStrategy physicalNamingStrategy = new SpringPhysicalNamingStrategy();
397+
398+
private final ImplicitNamingStrategy implicitNamingStrategy = new SpringImplicitNamingStrategy();
399+
400+
@Bean
401+
public HibernatePropertiesCustomizer testHibernatePropertiesCustomizer() {
402+
return (hibernateProperties) -> {
403+
hibernateProperties.put("hibernate.physical_naming_strategy",
404+
this.physicalNamingStrategy);
405+
hibernateProperties.put("hibernate.implicit_naming_strategy",
406+
this.implicitNamingStrategy);
407+
};
408+
}
409+
410+
}
411+
291412
public static class TestJtaPlatform implements JtaPlatform {
292413

293414
@Override

0 commit comments

Comments
 (0)