Back-off auto-conf on EntityManagerFactory bean
Don't auto-configure a LocalContainerEntityManagerFactoryBean if the user directly defines an EntityManagerFactory bean. Fixes gh-2803
This commit is contained in:
parent
3b6a37d44b
commit
a158baf50f
|
|
@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.orm.jpa;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.persistence.EntityManagerFactory;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.springframework.beans.BeansException;
|
||||
|
|
@ -105,7 +106,8 @@ public abstract class JpaBaseConfiguration implements BeanFactoryAware {
|
|||
|
||||
@Bean
|
||||
@Primary
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnMissingBean({ LocalContainerEntityManagerFactoryBean.class,
|
||||
EntityManagerFactory.class })
|
||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
|
||||
EntityManagerFactoryBuilder factoryBuilder) {
|
||||
Map<String, Object> vendorProperties = getVendorProperties();
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import java.lang.reflect.Field;
|
|||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.persistence.EntityManagerFactory;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform;
|
||||
|
|
@ -153,10 +154,10 @@ public abstract class AbstractJpaAutoConfigurationTests {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void usesManuallyDefinedEntityManagerFactoryBeanIfAvailable() {
|
||||
public void usesManuallyDefinedLocalContainerEntityManagerFactoryBeanIfAvailable() {
|
||||
EnvironmentTestUtils.addEnvironment(this.context,
|
||||
"spring.datasource.initialize:false");
|
||||
setupTestConfiguration(TestConfigurationWithEntityManagerFactory.class);
|
||||
setupTestConfiguration(TestConfigurationWithLocalContainerEntityManagerFactoryBean.class);
|
||||
this.context.refresh();
|
||||
LocalContainerEntityManagerFactoryBean factoryBean = this.context
|
||||
.getBean(LocalContainerEntityManagerFactoryBean.class);
|
||||
|
|
@ -164,6 +165,18 @@ public abstract class AbstractJpaAutoConfigurationTests {
|
|||
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
|
||||
public void usesManuallyDefinedTransactionManagerBeanIfAvailable() {
|
||||
setupTestConfiguration(TestConfigurationWithTransactionManager.class);
|
||||
|
|
@ -218,13 +231,12 @@ public abstract class AbstractJpaAutoConfigurationTests {
|
|||
}
|
||||
|
||||
@Configuration
|
||||
protected static class TestConfigurationWithEntityManagerFactory extends
|
||||
TestConfiguration {
|
||||
protected static class TestConfigurationWithLocalContainerEntityManagerFactoryBean
|
||||
extends TestConfiguration {
|
||||
|
||||
@Bean
|
||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
|
||||
DataSource dataSource, JpaVendorAdapter adapter) {
|
||||
|
||||
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
|
||||
factoryBean.setJpaVendorAdapter(adapter);
|
||||
factoryBean.setDataSource(dataSource);
|
||||
|
|
@ -235,6 +247,35 @@ public abstract class AbstractJpaAutoConfigurationTests {
|
|||
factoryBean.setJpaPropertyMap(properties);
|
||||
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
|
||||
|
|
|
|||
Loading…
Reference in New Issue