Commit a158baf5 authored by Phillip Webb's avatar Phillip Webb

Back-off auto-conf on EntityManagerFactory bean

Don't auto-configure a LocalContainerEntityManagerFactoryBean if the
user directly defines an EntityManagerFactory bean.

Fixes gh-2803
parent 3b6a37d4
...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.orm.jpa; ...@@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.orm.jpa;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
...@@ -105,7 +106,8 @@ public abstract class JpaBaseConfiguration implements BeanFactoryAware { ...@@ -105,7 +106,8 @@ public abstract class JpaBaseConfiguration implements BeanFactoryAware {
@Bean @Bean
@Primary @Primary
@ConditionalOnMissingBean @ConditionalOnMissingBean({ LocalContainerEntityManagerFactoryBean.class,
EntityManagerFactory.class })
public LocalContainerEntityManagerFactoryBean entityManagerFactory( public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder factoryBuilder) { EntityManagerFactoryBuilder factoryBuilder) {
Map<String, Object> vendorProperties = getVendorProperties(); Map<String, Object> vendorProperties = getVendorProperties();
......
...@@ -20,6 +20,7 @@ import java.lang.reflect.Field; ...@@ -20,6 +20,7 @@ import java.lang.reflect.Field;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform; import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform;
...@@ -153,10 +154,10 @@ public abstract class AbstractJpaAutoConfigurationTests { ...@@ -153,10 +154,10 @@ public abstract class AbstractJpaAutoConfigurationTests {
} }
@Test @Test
public void usesManuallyDefinedEntityManagerFactoryBeanIfAvailable() { public void usesManuallyDefinedLocalContainerEntityManagerFactoryBeanIfAvailable() {
EnvironmentTestUtils.addEnvironment(this.context, EnvironmentTestUtils.addEnvironment(this.context,
"spring.datasource.initialize:false"); "spring.datasource.initialize:false");
setupTestConfiguration(TestConfigurationWithEntityManagerFactory.class); setupTestConfiguration(TestConfigurationWithLocalContainerEntityManagerFactoryBean.class);
this.context.refresh(); this.context.refresh();
LocalContainerEntityManagerFactoryBean factoryBean = this.context LocalContainerEntityManagerFactoryBean factoryBean = this.context
.getBean(LocalContainerEntityManagerFactoryBean.class); .getBean(LocalContainerEntityManagerFactoryBean.class);
...@@ -164,6 +165,18 @@ public abstract class AbstractJpaAutoConfigurationTests { ...@@ -164,6 +165,18 @@ public abstract class AbstractJpaAutoConfigurationTests {
assertThat(map.get("configured"), equalTo((Object) "manually")); assertThat(map.get("configured"), equalTo((Object) "manually"));
} }
@Test
public void usesManuallyDefinedEntityManagerFactoryIfAvailable() {
EnvironmentTestUtils.addEnvironment(this.context,
"spring.datasource.initialize:false");
setupTestConfiguration(TestConfigurationWithEntityManagerFactory.class);
this.context.refresh();
EntityManagerFactory factoryBean = this.context
.getBean(EntityManagerFactory.class);
Map<String, Object> map = factoryBean.getProperties();
assertThat(map.get("configured"), equalTo((Object) "manually"));
}
@Test @Test
public void usesManuallyDefinedTransactionManagerBeanIfAvailable() { public void usesManuallyDefinedTransactionManagerBeanIfAvailable() {
setupTestConfiguration(TestConfigurationWithTransactionManager.class); setupTestConfiguration(TestConfigurationWithTransactionManager.class);
...@@ -218,13 +231,12 @@ public abstract class AbstractJpaAutoConfigurationTests { ...@@ -218,13 +231,12 @@ public abstract class AbstractJpaAutoConfigurationTests {
} }
@Configuration @Configuration
protected static class TestConfigurationWithEntityManagerFactory extends protected static class TestConfigurationWithLocalContainerEntityManagerFactoryBean
TestConfiguration { extends TestConfiguration {
@Bean @Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory( public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource, JpaVendorAdapter adapter) { DataSource dataSource, JpaVendorAdapter adapter) {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setJpaVendorAdapter(adapter); factoryBean.setJpaVendorAdapter(adapter);
factoryBean.setDataSource(dataSource); factoryBean.setDataSource(dataSource);
...@@ -235,6 +247,35 @@ public abstract class AbstractJpaAutoConfigurationTests { ...@@ -235,6 +247,35 @@ public abstract class AbstractJpaAutoConfigurationTests {
factoryBean.setJpaPropertyMap(properties); factoryBean.setJpaPropertyMap(properties);
return factoryBean; return factoryBean;
} }
}
@Configuration
protected static class TestConfigurationWithEntityManagerFactory extends
TestConfiguration {
@Bean
public EntityManagerFactory entityManagerFactory(DataSource dataSource,
JpaVendorAdapter adapter) {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setJpaVendorAdapter(adapter);
factoryBean.setDataSource(dataSource);
factoryBean.setPersistenceUnitName("manually-configured");
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("configured", "manually");
properties.put("hibernate.transaction.jta.platform", NoJtaPlatform.INSTANCE);
factoryBean.setJpaPropertyMap(properties);
factoryBean.afterPropertiesSet();
return factoryBean.getObject();
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
} }
@Configuration @Configuration
......
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