Interfaces and classes for managing JPA persistence units including scanning for entity classes, configuring persistence unit properties, and post-processing persistence unit metadata.
Most use cases are handled automatically by LocalContainerEntityManagerFactoryBean.setPackagesToScan(). Advanced customization options are documented below.
Used internally by LocalContainerEntityManagerFactoryBean. Explicit configuration only needed for advanced scenarios.
@Bean
public DefaultPersistenceUnitManager persistenceUnitManager(DataSource dataSource) {
DefaultPersistenceUnitManager pum = new DefaultPersistenceUnitManager();
pum.setPersistenceXmlLocations("classpath*:META-INF/persistence.xml");
pum.setDefaultDataSource(dataSource);
pum.setPackagesToScan("com.example.domain", "com.example.entities");
pum.setDefaultPersistenceUnitName("defaultPU");
pum.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
pum.setValidationMode(ValidationMode.AUTO);
return pum;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DefaultPersistenceUnitManager pum, DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setPersistenceUnitManager(pum);
em.setDataSource(dataSource);
return em;
}@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.example");
// Filter to only include entities with specific annotation
ManagedClassNameFilter filter = className -> {
try {
Class<?> clazz = Class.forName(className);
return clazz.isAnnotationPresent(Entity.class);
} catch (ClassNotFoundException e) {
return false;
}
};
em.setManagedClassNameFilter(filter);
return em;
}@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
em.setPackagesToScan("com.example.domain");
// Add custom post-processor
PersistenceUnitPostProcessor postProcessor = pui -> {
// Customize persistence unit
pui.addManagedClassName("com.example.CustomEntity");
pui.setValidationMode(ValidationMode.CALLBACK);
pui.addProperty("custom.property", "value");
};
em.setPersistenceUnitPostProcessors(postProcessor);
return em;
}For Spring AOT/GraalVM native images:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
DataSource dataSource,
PersistenceManagedTypesScanner scanner) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
// Use scanner to find managed types
PersistenceManagedTypes managedTypes =
scanner.scan("com.example.domain", "com.example.entities");
em.setManagedTypes(managedTypes);
return em;
}
@Bean
public PersistenceManagedTypesScanner managedTypesScanner(ResourceLoader resourceLoader) {
return new PersistenceManagedTypesScanner(resourceLoader);
}For advanced custom bootstrapping with SpringPersistenceUnitInfo:
@Configuration
public class CustomJpaBootstrap {
@Bean
public EntityManagerFactory entityManagerFactory(
DataSource dataSource,
LoadTimeWeaver loadTimeWeaver,
PersistenceManagedTypes managedTypes) {
// Create Spring-specific persistence unit info
SpringPersistenceUnitInfo pui = new SpringPersistenceUnitInfo(loadTimeWeaver);
pui.setPersistenceUnitName("customPU");
pui.setNonJtaDataSource(dataSource);
pui.setPersistenceProviderClassName(
"org.hibernate.jpa.HibernatePersistenceProvider");
// Apply managed types from AOT or scanning
pui.apply(managedTypes);
// Configure for Spring bean scoping
pui.setScopeAnnotationName("org.springframework.context.annotation.Scope");
pui.addQualifierAnnotationName("org.springframework.beans.factory.annotation.Qualifier");
// Convert to standard JPA descriptor
PersistenceUnitInfo standardPui = pui.asStandardPersistenceUnitInfo();
// Bootstrap EntityManagerFactory
PersistenceProvider provider = new HibernatePersistenceProvider();
return provider.createContainerEntityManagerFactory(standardPui, Map.of());
}
}class DefaultPersistenceUnitManager {
// Persistence XML configuration
void setPersistenceXmlLocation(String location);
void setPersistenceXmlLocations(String... locations);
// Default configuration
void setDefaultPersistenceUnitName(String name);
void setDefaultPersistenceUnitRootLocation(String location);
void setPersistenceConfiguration(PersistenceConfiguration config); // JPA 3.2+
// Entity scanning
void setPackagesToScan(String... packages);
void setManagedTypes(PersistenceManagedTypes types);
void setManagedClassNameFilter(ManagedClassNameFilter filter);
// Mapping resources
void setMappingResources(String... resources);
// Cache and validation
void setSharedCacheMode(SharedCacheMode mode);
void setValidationMode(ValidationMode mode);
// DataSource configuration
void setDefaultDataSource(DataSource dataSource);
void setDefaultJtaDataSource(DataSource dataSource);
void setDataSourceLookup(DataSourceLookup lookup);
// Post-processing
void setPersistenceUnitPostProcessors(PersistenceUnitPostProcessor... processors);
// Load-time weaving
void setLoadTimeWeaver(LoadTimeWeaver weaver);
// Obtain persistence units
PersistenceUnitInfo obtainDefaultPersistenceUnitInfo();
PersistenceUnitInfo obtainPersistenceUnitInfo(String name);
}interface PersistenceManagedTypes {
List<String> getManagedClassNames();
List<String> getManagedPackages();
URL getPersistenceUnitRootUrl();
// Factory methods
static PersistenceManagedTypes of(String... managedClassNames);
static PersistenceManagedTypes of(List<String> classNames, List<String> packages);
}@FunctionalInterface
interface ManagedClassNameFilter {
boolean matches(String className);
}@FunctionalInterface
interface PersistenceUnitPostProcessor {
void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui);
}class SpringPersistenceUnitInfo {
// Constructors
SpringPersistenceUnitInfo(LoadTimeWeaver weaver);
SpringPersistenceUnitInfo(ClassLoader classLoader);
// Apply managed types and configuration
void apply(PersistenceManagedTypes managedTypes);
void apply(PersistenceConfiguration config, DataSourceLookup dataSourceLookup);
// Expose standard descriptor
PersistenceUnitInfo asStandardPersistenceUnitInfo();
// Spring bean scoping
void setScopeAnnotationName(String name);
String getScopeAnnotationName();
void addQualifierAnnotationName(String name);
List<String> getQualifierAnnotationNames();
// Standard PersistenceUnitInfo methods
void setPersistenceUnitName(String name);
void setPersistenceProviderClassName(String className);
void setTransactionType(PersistenceUnitTransactionType type);
void setNonJtaDataSource(DataSource dataSource);
void setJtaDataSource(DataSource dataSource);
void addManagedClassName(String className);
void addManagedPackage(String packageName);
void addMappingFileName(String fileName);
void addJarFileUrl(URL url);
void setPersistenceUnitRootUrl(URL url);
void setSharedCacheMode(SharedCacheMode mode);
void setValidationMode(ValidationMode mode);
void addProperty(String name, String value);
void setProperties(Properties properties);
void setExcludeUnlistedClasses(boolean exclude);
}