or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

exception-translation.mdhibernate-configuration.mdhibernate-transaction-management.mdindex.mdjpa-configuration.mdjpa-transaction-management.mdjpa-vendor-adapters.mdpersistence-unit-management.mdshared-resources.mdutility-classes.mdweb-integration.md
tile.json

persistence-unit-management.mddocs/

Persistence Unit Management

Interfaces and classes for managing JPA persistence units including scanning for entity classes, configuring persistence unit properties, and post-processing persistence unit metadata.

Quick Patterns

Most use cases are handled automatically by LocalContainerEntityManagerFactoryBean.setPackagesToScan(). Advanced customization options are documented below.

DefaultPersistenceUnitManager

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;
}

Entity Scanning with Filter

@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;
}

Persistence Unit Post-Processing

@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;
}

Pre-Scanned Types (AOT Support)

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);
}

Custom Persistence Unit Bootstrap (JPA 3.2+)

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());
    }
}

API Reference

DefaultPersistenceUnitManager

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);
}

PersistenceManagedTypes

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);
}

ManagedClassNameFilter

@FunctionalInterface
interface ManagedClassNameFilter {

    boolean matches(String className);
}

PersistenceUnitPostProcessor

@FunctionalInterface
interface PersistenceUnitPostProcessor {

    void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui);
}

SpringPersistenceUnitInfo

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);
}

Related Topics

  • JPA Configuration - EntityManagerFactory setup