📄 defaultpersistenceunitmanager.java
字号:
/**
* Specify the Spring LoadTimeWeaver to use for class instrumentation according
* to the JPA class transformer contract.
* <p>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 VM agent specified on JVM startup.
* <p>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).
* @see org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver
* @see org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver
* @see org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader
*/
public void setLoadTimeWeaver(LoadTimeWeaver loadTimeWeaver) {
this.loadTimeWeaver = loadTimeWeaver;
}
/**
* Return the Spring LoadTimeWeaver to use for class instrumentation according
* to the JPA class transformer contract.
*/
public LoadTimeWeaver getLoadTimeWeaver() {
return this.loadTimeWeaver;
}
/**
* Set the PersistenceUnitPostProcessors to be applied to each
* PersistenceUnitInfo that has been parsed by this manager.
* <p>Such post-processors can, for example, register further entity
* classes and jar files, in addition to the metadata read in from
* <code>persistence.xml</code>.
*/
public void setPersistenceUnitPostProcessors(PersistenceUnitPostProcessor[] postProcessors) {
this.persistenceUnitPostProcessors = postProcessors;
}
/**
* Return the PersistenceUnitPostProcessors to be applied to each
* PersistenceUnitInfo that has been parsed by this manager.
*/
public PersistenceUnitPostProcessor[] getPersistenceUnitPostProcessors() {
return this.persistenceUnitPostProcessors;
}
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourcePatternResolver = (resourceLoader != null ?
ResourcePatternUtils.getResourcePatternResolver(resourceLoader) :
new PathMatchingResourcePatternResolver());
}
public void afterPropertiesSet() {
preparePersistenceUnitInfos();
}
/**
* Prepare the PersistenceUnitInfos according to the configuration
* of this manager: scanning for <code>persistence.xml</code> files,
* parsing all matching files, configurating and post-processing them.
* <p>PersistenceUnitInfos cannot be obtained before this preparation
* method has been invoked.
* @see #obtainDefaultPersistenceUnitInfo()
* @see #obtainPersistenceUnitInfo(String)
*/
public void preparePersistenceUnitInfos() {
this.persistenceUnitInfoNames.clear();
this.persistenceUnitInfos.clear();
SpringPersistenceUnitInfo[] puis = readPersistenceUnitInfos();
for (int i = 0; i < puis.length; i++) {
SpringPersistenceUnitInfo pui = puis[i];
if (pui.getPersistenceUnitRootUrl() == null) {
pui.setPersistenceUnitRootUrl(determineDefaultPersistenceUnitRootUrl());
}
if (pui.getNonJtaDataSource() == null) {
pui.setNonJtaDataSource(this.defaultDataSource);
}
pui.setLoadTimeWeaver(this.loadTimeWeaver);
postProcessPersistenceUnitInfo(pui);
String name = pui.getPersistenceUnitName();
this.persistenceUnitInfoNames.add(name);
this.persistenceUnitInfos.put(name, pui);
}
}
/**
* Read all persistence unit infos from <code>persistence.xml</code>,
* as defined in the JPA specification.
*/
private SpringPersistenceUnitInfo[] readPersistenceUnitInfos() {
PersistenceUnitReader reader = new PersistenceUnitReader(this.resourcePatternResolver, this.dataSourceLookup);
return reader.readPersistenceUnitInfos(this.persistenceXmlLocations);
}
/**
* Try to determine the persistence unit root URL based on the given
* "defaultPersistenceUnitRootLocation".
* @return the persistence unit root URL to pass to the JPA PersistenceProvider
* @see #setDefaultPersistenceUnitRootLocation
*/
private URL determineDefaultPersistenceUnitRootUrl() {
if (this.defaultPersistenceUnitRootLocation == null) {
return null;
}
try {
Resource res = this.resourcePatternResolver.getResource(this.defaultPersistenceUnitRootLocation);
return res.getURL();
}
catch (IOException ex) {
throw new PersistenceException("Unable to resolve persistence unit root URL", ex);
}
}
/**
* Return the specified PersistenceUnitInfo from this manager's cache
* of processed persistence units, keeping it in the cache (i.e. not
* 'obtaining' it for use but rather just accessing it for post-processing).
* <p>This can be used in {@link #postProcessPersistenceUnitInfo} implementations,
* detecting existing persistence units of the same name and potentially merging them.
* @param persistenceUnitName the name of the desired persistence unit
* @return the PersistenceUnitInfo in mutable form,
* or <code>null</code> if not available
*/
protected final MutablePersistenceUnitInfo getPersistenceUnitInfo(String persistenceUnitName) {
return this.persistenceUnitInfos.get(persistenceUnitName);
}
/**
* Hook method allowing subclasses to customize each PersistenceUnitInfo.
* <p>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.
* @param pui the chosen PersistenceUnitInfo, as read from <code>persistence.xml</code>.
* Passed in as MutablePersistenceUnitInfo.
* @see #setPersistenceUnitPostProcessors
*/
protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
PersistenceUnitPostProcessor[] postProcessors = getPersistenceUnitPostProcessors();
if (postProcessors != null) {
for (int i = 0; i < postProcessors.length; i++) {
postProcessors[i].postProcessPersistenceUnitInfo(pui);
}
}
}
public PersistenceUnitInfo obtainDefaultPersistenceUnitInfo() {
if (this.persistenceUnitInfoNames.isEmpty()) {
throw new IllegalStateException("No persistence units parsed from " +
ObjectUtils.nullSafeToString(this.persistenceXmlLocations));
}
if (this.persistenceUnitInfos.isEmpty()) {
throw new IllegalStateException("All persistence units from " +
ObjectUtils.nullSafeToString(this.persistenceXmlLocations) + " already obtained");
}
if (this.persistenceUnitInfos.size() > 1) {
throw new IllegalStateException("No single default persistence unit defined in " +
ObjectUtils.nullSafeToString(this.persistenceXmlLocations));
}
PersistenceUnitInfo pui = this.persistenceUnitInfos.values().iterator().next();
this.persistenceUnitInfos.clear();
return pui;
}
public PersistenceUnitInfo obtainPersistenceUnitInfo(String persistenceUnitName) {
PersistenceUnitInfo pui = this.persistenceUnitInfos.remove(persistenceUnitName);
if (pui == null) {
if (!this.persistenceUnitInfoNames.contains(persistenceUnitName)) {
throw new IllegalArgumentException(
"No persistence unit with name '" + persistenceUnitName + "' found");
}
else {
throw new IllegalStateException(
"Persistence unit with name '" + persistenceUnitName + "' already obtained");
}
}
return pui;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -