/** * Perform Spring-based scanning for entity classes. * * @see #setPackagesToScan */ private SpringPersistenceUnitInfo buildDefaultPersistenceUnitInfo() { SpringPersistenceUnitInfo scannedUnit = new SpringPersistenceUnitInfo(); scannedUnit.setPersistenceUnitName(this.defaultPersistenceUnitName); scannedUnit.excludeUnlistedClasses(); if (this.packagesToScan != null) { for (String pkg : this.packagesToScan) { try { String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(pkg) + ENTITY_CLASS_RESOURCE_PATTERN; Resource[] resources = this.resourcePatternResolver.getResources(pattern); MetadataReaderFactory readerFactory = new CachingMetadataReaderFactory(this.resourcePatternResolver); for (Resource resource : resources) { if (resource.isReadable()) { MetadataReader reader = readerFactory.getMetadataReader(resource); String className = reader.getClassMetadata().getClassName(); if (matchesFilter(reader, readerFactory)) { scannedUnit.addManagedClassName(className); } } } } catch (IOException ex) { throw new PersistenceException("Failed to scan classpath for unlisted classes", ex); } } } if (this.mappingResources != null) { for (String mappingFileName : this.mappingResources) { scannedUnit.addMappingFileName(mappingFileName); } } return scannedUnit; }
/** * 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(); List<SpringPersistenceUnitInfo> puis = readPersistenceUnitInfos(); for (SpringPersistenceUnitInfo pui : puis) { if (pui.getPersistenceUnitRootUrl() == null) { pui.setPersistenceUnitRootUrl(determineDefaultPersistenceUnitRootUrl()); } if (pui.getNonJtaDataSource() == null) { pui.setNonJtaDataSource(this.defaultDataSource); } if (this.loadTimeWeaver != null) { pui.init(this.loadTimeWeaver); } else { pui.init(this.resourcePatternResolver.getClassLoader()); } postProcessPersistenceUnitInfo(pui); String name = pui.getPersistenceUnitName(); if (!this.persistenceUnitInfoNames.add(name)) { StringBuilder msg = new StringBuilder(); msg.append("Conflicting persistence unit definitions for name '") .append(name) .append("': "); msg.append(pui.getPersistenceUnitRootUrl()).append(", "); msg.append(this.persistenceUnitInfos.get(name).getPersistenceUnitRootUrl()); throw new IllegalStateException(msg.toString()); } PersistenceUnitInfo puiToStore = pui; if (jpa2ApiPresent) { puiToStore = (PersistenceUnitInfo) Proxy.newProxyInstance( SmartPersistenceUnitInfo.class.getClassLoader(), new Class[] {SmartPersistenceUnitInfo.class}, new Jpa2PersistenceUnitInfoDecorator(pui)); } this.persistenceUnitInfos.put(name, puiToStore); } }