From c3c83c8a6c2b14c0d365acba73fa34cba75cfb8e Mon Sep 17 00:00:00 2001 From: johnniang Date: Fri, 26 Feb 2021 09:49:07 +0800 Subject: [PATCH 1/2] 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 --- .../AbstractJpaAutoConfigurationTests.java | 26 +++++++++++++++++++ .../orm/jpa/EntityManagerFactoryBuilder.java | 15 +++++++++++ 2 files changed, 41 insertions(+) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java index 2507d82a95..5880e30b49 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java +++ b/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; 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 { }); } + @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 { } + @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 { diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/EntityManagerFactoryBuilder.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/EntityManagerFactoryBuilder.java index 84aa4d979f..df47ec1881 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/EntityManagerFactoryBuilder.java +++ b/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; 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 { 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 { 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 { if (EntityManagerFactoryBuilder.this.bootstrapExecutor != null) { entityManagerFactoryBean.setBootstrapExecutor(EntityManagerFactoryBuilder.this.bootstrapExecutor); } + entityManagerFactoryBean + .setPersistenceUnitPostProcessors(EntityManagerFactoryBuilder.this.persistenceUnitPostProcessors); return entityManagerFactoryBean; } From e1b158073228511b697ab8fb809c2c2e5aac0ad9 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sat, 27 Feb 2021 11:33:52 +0100 Subject: [PATCH 2/2] Polish "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 --- .../jpa/AbstractJpaAutoConfigurationTests.java | 2 +- .../boot/orm/jpa/EntityManagerFactoryBuilder.java | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java index 5880e30b49..167cb8cc98 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/orm/jpa/AbstractJpaAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/EntityManagerFactoryBuilder.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/EntityManagerFactoryBuilder.java index df47ec1881..edde2446d0 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/EntityManagerFactoryBuilder.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/orm/jpa/EntityManagerFactoryBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -108,9 +108,10 @@ public class EntityManagerFactoryBuilder { } /** - * Set the PersistenceUnitPostProcessors to be applied to the PersistenceUnitInfo used - * for creating this EntityManagerFactory. - * @param persistenceUnitPostProcessors internal persistence unit post processors + * Set the {@linkplain PersistenceUnitPostProcessor persistence unit post processors} + * to be applied to the PersistenceUnitInfo used for creating the + * {@link LocalContainerEntityManagerFactoryBean}. + * @param persistenceUnitPostProcessors the persistence unit post processors to use * @since 2.5.0 */ public void setPersistenceUnitPostProcessors(PersistenceUnitPostProcessor... persistenceUnitPostProcessors) { @@ -245,8 +246,10 @@ public class EntityManagerFactoryBuilder { if (EntityManagerFactoryBuilder.this.bootstrapExecutor != null) { entityManagerFactoryBean.setBootstrapExecutor(EntityManagerFactoryBuilder.this.bootstrapExecutor); } - entityManagerFactoryBean - .setPersistenceUnitPostProcessors(EntityManagerFactoryBuilder.this.persistenceUnitPostProcessors); + if (EntityManagerFactoryBuilder.this.persistenceUnitPostProcessors != null) { + entityManagerFactoryBean.setPersistenceUnitPostProcessors( + EntityManagerFactoryBuilder.this.persistenceUnitPostProcessors); + } return entityManagerFactoryBean; }