Add support for configuring additional PersistenceUnitPostProcessor

See gh-47802

Signed-off-by: Lansana DIOMANDE <lansana.diomande@epfedu.fr>
This commit is contained in:
Lansana DIOMANDE
2025-12-19 11:46:51 +01:00
committed by Stéphane Nicoll
parent ab28e5edfa
commit b8cefd2b9c
2 changed files with 53 additions and 0 deletions
@@ -114,6 +114,7 @@ import org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager
import org.springframework.orm.jpa.persistenceunit.ManagedClassNameFilter;
import org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitManager;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
@@ -351,6 +352,19 @@ class HibernateJpaAutoConfigurationTests {
});
}
@Test
void shouldProcessAllPersistenceUnitPostProcessorsDeclaredAsBeans() {
this.contextRunner.withUserConfiguration(TestConfigurationWithMultipleCustomPersistenceUnitPostProcessors.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", "customized.attribute.converter.class.othername");
});
}
@Test
void customManagedClassNameFilter() {
this.contextRunner.withBean(ManagedClassNameFilter.class, () -> (s) -> !s.endsWith("City"))
@@ -1168,6 +1182,24 @@ class HibernateJpaAutoConfigurationTests {
}
@Configuration(proxyBeanMethods = false)
@TestAutoConfigurationPackage(HibernateJpaAutoConfigurationTests.class)
static class TestConfigurationWithMultipleCustomPersistenceUnitPostProcessors {
@Bean
EntityManagerFactoryBuilderCustomizer entityManagerFactoryBuilderCustomizer() {
return (builder) -> builder.addPersistenceUnitPostProcessors(
(pui) -> pui.addManagedClassName("customized.attribute.converter.class.name"));
}
@Bean
EntityManagerFactoryBuilderCustomizer otherEntityManagerFactoryBuilderCustomizer() {
return (builder) -> builder.addPersistenceUnitPostProcessors(
(pui) -> pui.addManagedClassName("customized.attribute.converter.class.othername"));
}
}
static class CustomJpaTransactionManager extends JpaTransactionManager {
}
@@ -17,9 +17,12 @@
package org.springframework.boot.jpa;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
@@ -129,6 +132,24 @@ public class EntityManagerFactoryBuilder {
this.persistenceUnitPostProcessors = persistenceUnitPostProcessors;
}
/**
* Add some {@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
*/
public void addPersistenceUnitPostProcessors(PersistenceUnitPostProcessor... persistenceUnitPostProcessors) {
if (this.persistenceUnitPostProcessors == null) {
this.persistenceUnitPostProcessors = persistenceUnitPostProcessors;
return;
}
var combined = new ArrayList<>(Arrays.asList(this.persistenceUnitPostProcessors));
combined.addAll(Arrays.asList(persistenceUnitPostProcessors));
this.persistenceUnitPostProcessors = combined.toArray(PersistenceUnitPostProcessor[]::new);
}
/**
* A fluent builder for a LocalContainerEntityManagerFactoryBean.
*/