public class DefaultPersistenceUnitManager extends Object implements PersistenceUnitManager, ResourceLoaderAware, LoadTimeWeaverAware, InitializingBean
PersistenceUnitManager
interface.
Used as internal default by
LocalContainerEntityManagerFactoryBean
.
Supports standard JPA scanning for persistence.xml
files,
with configurable file locations, JDBC DataSource lookup and load-time weaving.
The default XML file location is classpath*:META-INF/persistence.xml
,
scanning for all matching files in the classpath (as defined in the JPA specification).
DataSource names are by default interpreted as JNDI names, and no load time weaving
is available (which requires weaving to be turned off in the persistence provider).
NOTE: Spring's JPA support requires JPA 2.1 or higher, as of Spring 5.0.
setPersistenceXmlLocations(java.lang.String...)
,
setDataSourceLookup(org.springframework.jdbc.datasource.lookup.DataSourceLookup)
,
setLoadTimeWeaver(org.springframework.instrument.classloading.LoadTimeWeaver)
,
LocalContainerEntityManagerFactoryBean.setPersistenceUnitManager(org.springframework.orm.jpa.persistenceunit.PersistenceUnitManager)
Modifier and Type | Field and Description |
---|---|
static String |
DEFAULT_PERSISTENCE_XML_LOCATION
Default location of the
persistence.xml file:
"classpath*:META-INF/persistence.xml". |
protected Log |
logger |
static String |
ORIGINAL_DEFAULT_PERSISTENCE_UNIT_NAME |
static String |
ORIGINAL_DEFAULT_PERSISTENCE_UNIT_ROOT_LOCATION
Default location for the persistence unit root URL:
"classpath:", indicating the root of the classpath.
|
Constructor and Description |
---|
DefaultPersistenceUnitManager() |
Modifier and Type | Method and Description |
---|---|
void |
afterPropertiesSet()
Invoked by the containing
BeanFactory after it has set all bean properties
and satisfied BeanFactoryAware , ApplicationContextAware etc. |
DataSourceLookup |
getDataSourceLookup()
Return the JDBC DataSourceLookup that provides DataSources for the
persistence provider, resolving data source names in
persistence.xml
against Spring-managed DataSource instances. |
DataSource |
getDefaultDataSource()
Return the JDBC DataSource that the JPA persistence provider is supposed to use
for accessing the database if none has been specified in
persistence.xml . |
DataSource |
getDefaultJtaDataSource()
Return the JTA-aware DataSource that the JPA persistence provider is supposed to use
for accessing the database if none has been specified in
persistence.xml . |
LoadTimeWeaver |
getLoadTimeWeaver()
Return the Spring LoadTimeWeaver to use for class instrumentation according
to the JPA class transformer contract.
|
protected MutablePersistenceUnitInfo |
getPersistenceUnitInfo(String persistenceUnitName)
Return the specified PersistenceUnitInfo from this manager's cache
of processed persistence units, keeping it in the cache (i.e.
|
PersistenceUnitPostProcessor[] |
getPersistenceUnitPostProcessors()
Return the PersistenceUnitPostProcessors to be applied to each
PersistenceUnitInfo that has been parsed by this manager.
|
protected boolean |
isPersistenceUnitOverrideAllowed()
Return whether an override of a same-named persistence unit is allowed.
|
PersistenceUnitInfo |
obtainDefaultPersistenceUnitInfo()
Obtain the default PersistenceUnitInfo from this manager.
|
PersistenceUnitInfo |
obtainPersistenceUnitInfo(String persistenceUnitName)
Obtain the specified PersistenceUnitInfo from this manager.
|
protected void |
postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui)
Hook method allowing subclasses to customize each PersistenceUnitInfo.
|
void |
preparePersistenceUnitInfos()
Prepare the PersistenceUnitInfos according to the configuration
of this manager: scanning for
persistence.xml files,
parsing all matching files, configuring and post-processing them. |
void |
setDataSourceLookup(DataSourceLookup dataSourceLookup)
Specify the JDBC DataSourceLookup that provides DataSources for the
persistence provider, resolving data source names in
persistence.xml
against Spring-managed DataSource instances. |
void |
setDataSources(Map<String,DataSource> dataSources)
Specify the JDBC DataSources that the JPA persistence provider is supposed
to use for accessing the database, resolving data source names in
persistence.xml against Spring-managed DataSources. |
void |
setDefaultDataSource(DataSource defaultDataSource)
Specify the JDBC DataSource that the JPA persistence provider is supposed to use
for accessing the database if none has been specified in
persistence.xml . |
void |
setDefaultJtaDataSource(DataSource defaultJtaDataSource)
Specify the JDBC DataSource that the JPA persistence provider is supposed to use
for accessing the database if none has been specified in
persistence.xml . |
void |
setDefaultPersistenceUnitName(String defaultPersistenceUnitName)
Specify the name of the default persistence unit, if any.
|
void |
setDefaultPersistenceUnitRootLocation(String defaultPersistenceUnitRootLocation)
Set the default persistence unit root location, to be applied
if no unit-specific persistence unit root could be determined.
|
void |
setLoadTimeWeaver(LoadTimeWeaver loadTimeWeaver)
Specify the Spring LoadTimeWeaver to use for class instrumentation according
to the JPA class transformer contract.
|
void |
setMappingResources(String... mappingResources)
Specify one or more mapping resources (equivalent to
<mapping-file>
entries in persistence.xml ) for the default persistence unit. |
void |
setPackagesToScan(String... packagesToScan)
Set whether to use Spring-based scanning for entity classes in the classpath
instead of using JPA's standard scanning of jar files with
persistence.xml
markers in them. |
void |
setPersistenceUnitPostProcessors(PersistenceUnitPostProcessor... postProcessors)
Set the PersistenceUnitPostProcessors to be applied to each
PersistenceUnitInfo that has been parsed by this manager.
|
void |
setPersistenceXmlLocation(String persistenceXmlLocation)
Specify the location of the
persistence.xml files to load. |
void |
setPersistenceXmlLocations(String... persistenceXmlLocations)
Specify multiple locations of
persistence.xml files to load. |
void |
setResourceLoader(ResourceLoader resourceLoader)
Set the ResourceLoader that this object runs in.
|
void |
setSharedCacheMode(SharedCacheMode sharedCacheMode)
Specify the JPA 2.0 shared cache mode for all of this manager's persistence
units, overriding any value in
persistence.xml if set. |
void |
setValidationMode(ValidationMode validationMode)
Specify the JPA 2.0 validation mode for all of this manager's persistence
units, overriding any value in
persistence.xml if set. |
public static final String DEFAULT_PERSISTENCE_XML_LOCATION
persistence.xml
file:
"classpath*:META-INF/persistence.xml".public static final String ORIGINAL_DEFAULT_PERSISTENCE_UNIT_ROOT_LOCATION
public static final String ORIGINAL_DEFAULT_PERSISTENCE_UNIT_NAME
protected final Log logger
public void setPersistenceXmlLocation(String persistenceXmlLocation)
persistence.xml
files to load.
These can be specified as Spring resource locations and/or location patterns.
Default is "classpath*:META-INF/persistence.xml".
public void setPersistenceXmlLocations(String... persistenceXmlLocations)
persistence.xml
files to load.
These can be specified as Spring resource locations and/or location patterns.
Default is "classpath*:META-INF/persistence.xml".
persistenceXmlLocations
- an array of Spring resource Strings
identifying the location of the persistence.xml
files to readpublic void setDefaultPersistenceUnitRootLocation(String defaultPersistenceUnitRootLocation)
Default is "classpath:", that is, the root of the current classpath (nearest root directory). To be overridden if unit-specific resolution does not work and the classpath root is not appropriate either.
public void setDefaultPersistenceUnitName(String defaultPersistenceUnitName)
Primarily applied to a scanned persistence unit without persistence.xml
.
Also applicable to selecting a default unit from several persistence units available.
public void setPackagesToScan(String... packagesToScan)
persistence.xml
markers in them. In case of Spring-based scanning, no persistence.xml
is necessary; all you need to do is to specify base packages to search here.
Default is none. Specify packages to search for autodetection of your entity
classes in the classpath. This is analogous to Spring's component-scan feature
(ClassPathBeanDefinitionScanner
).
Such package scanning defines a "default persistence unit" in Spring, which
may live next to regularly defined units originating from persistence.xml
.
Its name is determined by setDefaultPersistenceUnitName(java.lang.String)
: by default,
it's simply "default".
Note: There may be limitations in comparison to regular JPA scanning.
In particular, JPA providers may pick up annotated packages for provider-specific
annotations only when driven by persistence.xml
. As of 4.1, Spring's
scan can detect annotated packages as well if supported by the given
JpaVendorAdapter
(e.g. for Hibernate).
If no explicit mapping resources
have been
specified in addition to these packages, this manager looks for a default
META-INF/orm.xml
file in the classpath, registering it as a mapping
resource for the default unit if the mapping file is not co-located with a
persistence.xml
file (in which case we assume it is only meant to be
used with the persistence units defined there, like in standard JPA).
public void setMappingResources(String... mappingResources)
<mapping-file>
entries in persistence.xml
) for the default persistence unit.
Can be used on its own or in combination with entity scanning in the classpath,
in both cases avoiding persistence.xml
.
Note that mapping resources must be relative to the classpath root,
e.g. "META-INF/mappings.xml" or "com/mycompany/repository/mappings.xml",
so that they can be loaded through ClassLoader.getResource
.
If no explicit mapping resources have been specified next to
packages to scan
, this manager looks for a default
META-INF/orm.xml
file in the classpath, registering it as a mapping
resource for the default unit if the mapping file is not co-located with a
persistence.xml
file (in which case we assume it is only meant to be
used with the persistence units defined there, like in standard JPA).
Note that specifying an empty array/list here suppresses the default
META-INF/orm.xml
check. On the other hand, explicitly specifying
META-INF/orm.xml
here will register that file even if it happens
to be co-located with a persistence.xml
file.
public void setSharedCacheMode(SharedCacheMode sharedCacheMode)
persistence.xml
if set.PersistenceUnitInfo.getSharedCacheMode()
public void setValidationMode(ValidationMode validationMode)
persistence.xml
if set.PersistenceUnitInfo.getValidationMode()
public void setDataSources(Map<String,DataSource> dataSources)
persistence.xml
against Spring-managed DataSources.
The specified Map needs to define data source names for specific DataSource
objects, matching the data source names used in persistence.xml
.
If not specified, data source names will be resolved as JNDI names instead
(as defined by standard JPA).
MapDataSourceLookup
public void setDataSourceLookup(@Nullable DataSourceLookup dataSourceLookup)
persistence.xml
against Spring-managed DataSource instances.
Default is JndiDataSourceLookup, which resolves DataSource names as JNDI names (as defined by standard JPA). Specify a BeanFactoryDataSourceLookup instance if you want DataSource names to be resolved against Spring bean names.
Alternatively, consider passing in a map from names to DataSource instances
via the "dataSources" property. If the persistence.xml
file
does not define DataSource names at all, specify a default DataSource
via the "defaultDataSource" property.
@Nullable public DataSourceLookup getDataSourceLookup()
persistence.xml
against Spring-managed DataSource instances.public void setDefaultDataSource(@Nullable DataSource defaultDataSource)
persistence.xml
.
This variant indicates no special transaction setup, i.e. typical resource-local.
In JPA speak, a DataSource passed in here will be uses as "nonJtaDataSource" on the PersistenceUnitInfo passed to the PersistenceProvider, provided that none has been registered before.
@Nullable public DataSource getDefaultDataSource()
persistence.xml
.public void setDefaultJtaDataSource(@Nullable DataSource defaultJtaDataSource)
persistence.xml
.
This variant indicates that JTA is supposed to be used as transaction type.
In JPA speak, a DataSource passed in here will be uses as "jtaDataSource" on the PersistenceUnitInfo passed to the PersistenceProvider, provided that none has been registered before.
PersistenceUnitInfo.getJtaDataSource()
@Nullable public DataSource getDefaultJtaDataSource()
persistence.xml
.public void setPersistenceUnitPostProcessors(@Nullable PersistenceUnitPostProcessor... postProcessors)
Such post-processors can, for example, register further entity classes and
jar files, in addition to the metadata read from persistence.xml
.
@Nullable public PersistenceUnitPostProcessor[] getPersistenceUnitPostProcessors()
public void setLoadTimeWeaver(@Nullable LoadTimeWeaver loadTimeWeaver)
It is not required to specify a LoadTimeWeaver: Most providers will be able to provide a subset of their functionality without class instrumentation as well, or operate with their own VM agent specified on JVM startup. Furthermore, DefaultPersistenceUnitManager falls back to an InstrumentationLoadTimeWeaver if Spring's agent-based instrumentation is available at runtime.
In terms of Spring-provided weaving options, the most important ones are
InstrumentationLoadTimeWeaver, which requires a Spring-specific (but very general)
VM agent specified on JVM startup, and ReflectiveLoadTimeWeaver, which interacts
with an underlying ClassLoader based on specific extended methods being available
on it (for example, interacting with Spring's TomcatInstrumentableClassLoader).
Consider using the context:load-time-weaver
XML tag for creating
such a shared LoadTimeWeaver (autodetecting the environment by default).
setLoadTimeWeaver
in interface LoadTimeWeaverAware
loadTimeWeaver
- the LoadTimeWeaver
instance (never null
)InstrumentationLoadTimeWeaver
,
ReflectiveLoadTimeWeaver
@Nullable public LoadTimeWeaver getLoadTimeWeaver()
public void setResourceLoader(ResourceLoader resourceLoader)
ResourceLoaderAware
This might be a ResourcePatternResolver, which can be checked
through instanceof ResourcePatternResolver
. See also the
ResourcePatternUtils.getResourcePatternResolver
method.
Invoked after population of normal bean properties but before an init callback
like InitializingBean's afterPropertiesSet
or a custom init-method.
Invoked before ApplicationContextAware's setApplicationContext
.
setResourceLoader
in interface ResourceLoaderAware
resourceLoader
- the ResourceLoader object to be used by this objectResourcePatternResolver
,
ResourcePatternUtils.getResourcePatternResolver(org.springframework.core.io.ResourceLoader)
public void afterPropertiesSet()
InitializingBean
BeanFactory
after it has set all bean properties
and satisfied BeanFactoryAware
, ApplicationContextAware
etc.
This method allows the bean instance to perform validation of its overall configuration and final initialization when all bean properties have been set.
afterPropertiesSet
in interface InitializingBean
public void preparePersistenceUnitInfos()
persistence.xml
files,
parsing all matching files, configuring and post-processing them.
PersistenceUnitInfos cannot be obtained before this preparation method has been invoked.
@Nullable protected final MutablePersistenceUnitInfo getPersistenceUnitInfo(String persistenceUnitName)
This can be used in postProcessPersistenceUnitInfo(org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo)
implementations,
detecting existing persistence units of the same name and potentially merging them.
persistenceUnitName
- the name of the desired persistence unitnull
if not availableprotected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui)
The default implementation delegates to all registered PersistenceUnitPostProcessors. It is usually preferable to register further entity classes, jar files etc there rather than in a subclass of this manager, to be able to reuse the post-processors.
pui
- the chosen PersistenceUnitInfo, as read from persistence.xml
.
Passed in as MutablePersistenceUnitInfo.setPersistenceUnitPostProcessors(org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor...)
protected boolean isPersistenceUnitOverrideAllowed()
Default is false
. May be overridden to return true
,
for example if postProcessPersistenceUnitInfo(org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo)
is able to handle that case.
public PersistenceUnitInfo obtainDefaultPersistenceUnitInfo()
PersistenceUnitManager
obtainDefaultPersistenceUnitInfo
in interface PersistenceUnitManager
null
)public PersistenceUnitInfo obtainPersistenceUnitInfo(String persistenceUnitName)
PersistenceUnitManager
obtainPersistenceUnitInfo
in interface PersistenceUnitManager
persistenceUnitName
- the name of the desired persistence unitnull
)