Jakarta Persistence API provides a comprehensive framework for object-relational mapping, entity lifecycle management, and database operations in Java applications
Complete reference for implementing custom persistence providers and integrating with Jakarta Persistence SPI.
import jakarta.persistence.spi.*;Interface implemented by persistence providers.
/**
* Interface implemented by persistence providers
* @since 1.0
*/
public interface PersistenceProvider {
EntityManagerFactory createEntityManagerFactory(String emName, Map map);
EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map);
void generateSchema(PersistenceUnitInfo info, Map map);
boolean generateSchema(String persistenceUnitName, Map map);
ProviderUtil getProviderUtil();
}
/**
* Persistence unit information
* @since 1.0
*/
public interface PersistenceUnitInfo {
String getPersistenceUnitName();
String getPersistenceProviderClassName();
PersistenceUnitTransactionType getTransactionType();
DataSource getJtaDataSource();
DataSource getNonJtaDataSource();
List<String> getMappingFileNames();
List<URL> getJarFileUrls();
URL getPersistenceUnitRootUrl();
List<String> getManagedClassNames();
boolean excludeUnlistedClasses();
SharedCacheMode getSharedCacheMode();
ValidationMode getValidationMode();
Properties getProperties();
String getPersistenceXMLSchemaVersion();
ClassLoader getClassLoader();
void addTransformer(ClassTransformer transformer);
ClassLoader getNewTempClassLoader();
}
/**
* Provider utility methods
* @since 2.0
*/
public interface ProviderUtil {
LoadState isLoadedWithoutReference(Object entity, String attributeName);
LoadState isLoadedWithReference(Object entity, String attributeName);
LoadState isLoaded(Object entity);
}
/**
* Class transformer for bytecode enhancement
* @since 1.0
*/
public interface ClassTransformer {
byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
ProtectionDomain protectionDomain, byte[] classfileBuffer)
throws TransformerException;
}
/**
* Load state enumeration
* @since 2.0
*/
public enum LoadState {
LOADED,
NOT_LOADED,
UNKNOWN
}
/**
* Persistence unit transaction type
* @since 1.0
*/
public enum PersistenceUnitTransactionType {
JTA,
RESOURCE_LOCAL
}
/**
* Persistence provider resolver holder
* @since 2.0
*/
public class PersistenceProviderResolverHolder {
public static PersistenceProviderResolver getPersistenceProviderResolver();
public static void setPersistenceProviderResolver(PersistenceProviderResolver resolver);
}
/**
* Persistence provider resolver interface
* @since 2.0
*/
public interface PersistenceProviderResolver {
List<PersistenceProvider> getPersistenceProviders();
void clearCachedProviders();
}
/**
* Transformer exception
* @since 1.0
*/
public class TransformerException extends Exception {
public TransformerException();
public TransformerException(String message);
public TransformerException(String message, Throwable cause);
public TransformerException(Throwable cause);
}Usage Example:
// Custom persistence provider
public class CustomPersistenceProvider implements PersistenceProvider {
@Override
public EntityManagerFactory createEntityManagerFactory(String emName, Map map) {
// Implementation
return new CustomEntityManagerFactory();
}
@Override
public EntityManagerFactory createContainerEntityManagerFactory(
PersistenceUnitInfo info, Map map) {
// Implementation
return new CustomEntityManagerFactory();
}
@Override
public ProviderUtil getProviderUtil() {
return new CustomProviderUtil();
}
}
// Register custom provider
PersistenceProviderResolver resolver = new CustomPersistenceProviderResolver();
PersistenceProviderResolverHolder.setPersistenceProviderResolver(resolver);Install with Tessl CLI
npx tessl i tessl/maven-jakarta-persistence--jakarta-persistence-api