Browse Source

Allow to configure PersistenceUnitPostProcessor

This commit updates EntityManagerFactoryBuilder so that persistence unit
post processors can be registered and applied when creating an
EntityManagerFactory.

See gh-25443
pull/25134/head
johnniang 5 years ago committed by Stephane Nicoll
parent
commit
c3c83c8a6c
  1. 26
      spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java
  2. 15
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/EntityManagerFactoryBuilder.java

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

@ -21,6 +21,7 @@ import java.util.Map; @@ -21,6 +21,7 @@ import java.util.Map;
import java.util.UUID;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitInfo;
import javax.sql.DataSource;
import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform;
@ -229,6 +230,19 @@ abstract class AbstractJpaAutoConfigurationTests { @@ -229,6 +230,19 @@ abstract class AbstractJpaAutoConfigurationTests {
});
}
@Test
void customPersistenceUnitPostProcessors() {
this.contextRunner.withUserConfiguration(TestConfigurationWithCustomPersistenceUnitPostProcessors.class)
.run((context) -> {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = context
.getBean(LocalContainerEntityManagerFactoryBean.class);
PersistenceUnitInfo persistenceUnitInfo = entityManagerFactoryBean.getPersistenceUnitInfo();
assertThat(persistenceUnitInfo).isNotNull();
assertThat(persistenceUnitInfo.getManagedClassNames())
.contains("customized.attribute.converter.class.name");
});
}
@Configuration(proxyBeanMethods = false)
static class TestTwoDataSourcesConfiguration {
@ -388,6 +402,18 @@ abstract class AbstractJpaAutoConfigurationTests { @@ -388,6 +402,18 @@ abstract class AbstractJpaAutoConfigurationTests {
}
@Configuration(proxyBeanMethods = false)
@TestAutoConfigurationPackage(AbstractJpaAutoConfigurationTests.class)
static class TestConfigurationWithCustomPersistenceUnitPostProcessors {
@Bean
EntityManagerFactoryBuilderCustomizer entityManagerFactoryBuilderCustomizer() {
return (builder) -> builder.setPersistenceUnitPostProcessors(
(pui) -> pui.addManagedClassName("customized.attribute.converter.class.name"));
}
}
@SuppressWarnings("serial")
static class CustomJpaTransactionManager extends JpaTransactionManager {

15
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/EntityManagerFactoryBuilder.java

@ -29,6 +29,7 @@ import org.springframework.core.task.AsyncTaskExecutor; @@ -29,6 +29,7 @@ import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitManager;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
@ -58,6 +59,8 @@ public class EntityManagerFactoryBuilder { @@ -58,6 +59,8 @@ public class EntityManagerFactoryBuilder {
private AsyncTaskExecutor bootstrapExecutor;
private PersistenceUnitPostProcessor[] persistenceUnitPostProcessors;
/**
* Create a new instance passing in the common pieces that will be shared if multiple
* EntityManagerFactory instances are created.
@ -104,6 +107,16 @@ public class EntityManagerFactoryBuilder { @@ -104,6 +107,16 @@ public class EntityManagerFactoryBuilder {
this.bootstrapExecutor = bootstrapExecutor;
}
/**
* Set the PersistenceUnitPostProcessors to be applied to the PersistenceUnitInfo used
* for creating this EntityManagerFactory.
* @param persistenceUnitPostProcessors internal persistence unit post processors
* @since 2.5.0
*/
public void setPersistenceUnitPostProcessors(PersistenceUnitPostProcessor... persistenceUnitPostProcessors) {
this.persistenceUnitPostProcessors = persistenceUnitPostProcessors;
}
/**
* A fluent builder for a LocalContainerEntityManagerFactoryBean.
*/
@ -232,6 +245,8 @@ public class EntityManagerFactoryBuilder { @@ -232,6 +245,8 @@ public class EntityManagerFactoryBuilder {
if (EntityManagerFactoryBuilder.this.bootstrapExecutor != null) {
entityManagerFactoryBean.setBootstrapExecutor(EntityManagerFactoryBuilder.this.bootstrapExecutor);
}
entityManagerFactoryBean
.setPersistenceUnitPostProcessors(EntityManagerFactoryBuilder.this.persistenceUnitPostProcessors);
return entityManagerFactoryBean;
}

Loading…
Cancel
Save