Skip to content

Commit a158baf

Browse files
committed
Back-off auto-conf on EntityManagerFactory bean
Don't auto-configure a LocalContainerEntityManagerFactoryBean if the user directly defines an EntityManagerFactory bean. Fixes gh-2803
1 parent 3b6a37d commit a158baf

File tree

2 files changed

+49
-6
lines changed

2 files changed

+49
-6
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import java.util.Map;
2121

22+
import javax.persistence.EntityManagerFactory;
2223
import javax.sql.DataSource;
2324

2425
import org.springframework.beans.BeansException;
@@ -105,7 +106,8 @@ public EntityManagerFactoryBuilder entityManagerFactoryBuilder(
105106

106107
@Bean
107108
@Primary
108-
@ConditionalOnMissingBean
109+
@ConditionalOnMissingBean({ LocalContainerEntityManagerFactoryBean.class,
110+
EntityManagerFactory.class })
109111
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
110112
EntityManagerFactoryBuilder factoryBuilder) {
111113
Map<String, Object> vendorProperties = getVendorProperties();

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

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.HashMap;
2121
import java.util.Map;
2222

23+
import javax.persistence.EntityManagerFactory;
2324
import javax.sql.DataSource;
2425

2526
import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform;
@@ -153,17 +154,29 @@ public void customJpaProperties() throws Exception {
153154
}
154155

155156
@Test
156-
public void usesManuallyDefinedEntityManagerFactoryBeanIfAvailable() {
157+
public void usesManuallyDefinedLocalContainerEntityManagerFactoryBeanIfAvailable() {
157158
EnvironmentTestUtils.addEnvironment(this.context,
158159
"spring.datasource.initialize:false");
159-
setupTestConfiguration(TestConfigurationWithEntityManagerFactory.class);
160+
setupTestConfiguration(TestConfigurationWithLocalContainerEntityManagerFactoryBean.class);
160161
this.context.refresh();
161162
LocalContainerEntityManagerFactoryBean factoryBean = this.context
162163
.getBean(LocalContainerEntityManagerFactoryBean.class);
163164
Map<String, Object> map = factoryBean.getJpaPropertyMap();
164165
assertThat(map.get("configured"), equalTo((Object) "manually"));
165166
}
166167

168+
@Test
169+
public void usesManuallyDefinedEntityManagerFactoryIfAvailable() {
170+
EnvironmentTestUtils.addEnvironment(this.context,
171+
"spring.datasource.initialize:false");
172+
setupTestConfiguration(TestConfigurationWithEntityManagerFactory.class);
173+
this.context.refresh();
174+
EntityManagerFactory factoryBean = this.context
175+
.getBean(EntityManagerFactory.class);
176+
Map<String, Object> map = factoryBean.getProperties();
177+
assertThat(map.get("configured"), equalTo((Object) "manually"));
178+
}
179+
167180
@Test
168181
public void usesManuallyDefinedTransactionManagerBeanIfAvailable() {
169182
setupTestConfiguration(TestConfigurationWithTransactionManager.class);
@@ -218,13 +231,12 @@ public OpenEntityManagerInViewFilter openEntityManagerInViewFilter() {
218231
}
219232

220233
@Configuration
221-
protected static class TestConfigurationWithEntityManagerFactory extends
222-
TestConfiguration {
234+
protected static class TestConfigurationWithLocalContainerEntityManagerFactoryBean
235+
extends TestConfiguration {
223236

224237
@Bean
225238
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
226239
DataSource dataSource, JpaVendorAdapter adapter) {
227-
228240
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
229241
factoryBean.setJpaVendorAdapter(adapter);
230242
factoryBean.setDataSource(dataSource);
@@ -235,6 +247,35 @@ public LocalContainerEntityManagerFactoryBean entityManagerFactory(
235247
factoryBean.setJpaPropertyMap(properties);
236248
return factoryBean;
237249
}
250+
251+
}
252+
253+
@Configuration
254+
protected static class TestConfigurationWithEntityManagerFactory extends
255+
TestConfiguration {
256+
257+
@Bean
258+
public EntityManagerFactory entityManagerFactory(DataSource dataSource,
259+
JpaVendorAdapter adapter) {
260+
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
261+
factoryBean.setJpaVendorAdapter(adapter);
262+
factoryBean.setDataSource(dataSource);
263+
factoryBean.setPersistenceUnitName("manually-configured");
264+
Map<String, Object> properties = new HashMap<String, Object>();
265+
properties.put("configured", "manually");
266+
properties.put("hibernate.transaction.jta.platform", NoJtaPlatform.INSTANCE);
267+
factoryBean.setJpaPropertyMap(properties);
268+
factoryBean.afterPropertiesSet();
269+
return factoryBean.getObject();
270+
}
271+
272+
@Bean
273+
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
274+
JpaTransactionManager transactionManager = new JpaTransactionManager();
275+
transactionManager.setEntityManagerFactory(emf);
276+
return transactionManager;
277+
}
278+
238279
}
239280

240281
@Configuration

0 commit comments

Comments
 (0)