diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java index 8e50404fcc..c39d7542a2 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java @@ -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 vendorProperties = getVendorProperties(); diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java index d68309630f..3d9ae030a2 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java @@ -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 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 properties = new HashMap(); + 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