diff --git a/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java b/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java
index eae8cc1db..cab20a70d 100644
--- a/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java
+++ b/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java
@@ -61,29 +61,45 @@ public class MergingPersistenceUnitManager extends DefaultPersistenceUnitManager
* (non-Javadoc)
* @see org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager#isPersistenceUnitOverrideAllowed()
*/
+ @Override
protected boolean isPersistenceUnitOverrideAllowed() {
return true;
}
void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui, PersistenceUnitInfo oldPui) {
- for (URL url : oldPui.getJarFileUrls()) {
+ String persistenceUnitName = pui.getPersistenceUnitName();
- // Add jar file url to PUI
+ for (URL url : oldPui.getJarFileUrls()) {
if (!pui.getJarFileUrls().contains(url)) {
- log.debug("Adding {} to persistence units", url);
+ log.debug("Adding JAR file URL {} to persistence unit {}.", url, persistenceUnitName);
pui.addJarFileUrl(url);
}
}
for (String className : oldPui.getManagedClassNames()) {
-
if (!pui.getManagedClassNames().contains(className)) {
- log.debug("Adding class {} to PersistenceUnit {}", className, pui.getPersistenceUnitName());
+ log.debug("Adding class {} to PersistenceUnit {}", className, persistenceUnitName);
pui.addManagedClassName(className);
}
}
- pui.addJarFileUrl(oldPui.getPersistenceUnitRootUrl());
+ for (String mappingFileName : oldPui.getMappingFileNames()) {
+ if (!pui.getMappingFileNames().contains(mappingFileName)) {
+ log.debug("Adding mapping file to persistence unit {}.", mappingFileName, persistenceUnitName);
+ pui.addMappingFileName(mappingFileName);
+ }
+ }
+
+ URL newUrl = pui.getPersistenceUnitRootUrl();
+ URL oldUrl = oldPui.getPersistenceUnitRootUrl();
+
+ boolean hasNewRootUrl = newUrl != null;
+ boolean rootUrlsDiffer = hasNewRootUrl && !newUrl.equals(oldUrl);
+ boolean urlNotInJarUrls = hasNewRootUrl && !pui.getJarFileUrls().contains(oldUrl);
+
+ if (hasNewRootUrl && rootUrlsDiffer && urlNotInJarUrls) {
+ pui.addJarFileUrl(oldUrl);
+ }
}
}
diff --git a/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java b/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java
index 30529be67..6ac893ef8 100644
--- a/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java
+++ b/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java
@@ -25,7 +25,6 @@ import java.util.Arrays;
import javax.persistence.spi.PersistenceUnitInfo;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -59,11 +58,7 @@ public class MergingPersistenceUnitManagerUnitTests {
verify(newInfo).addJarFileUrl(jarFileUrl);
}
- /**
- * @FIXME - Reactivate as soon as Spring 3.1.1 gets released
- */
@Test
- @Ignore
public void mergesManagedClassesCorrectly() {
MergingPersistenceUnitManager manager = new MergingPersistenceUnitManager();
@@ -74,5 +69,54 @@ public class MergingPersistenceUnitManagerUnitTests {
PersistenceUnitInfo info = manager.obtainPersistenceUnitInfo("pu");
assertThat(info.getManagedClassNames().size(), is(2));
assertThat(info.getManagedClassNames(), hasItems(User.class.getName(), Role.class.getName()));
+
+ assertThat(info.getMappingFileNames().size(), is(2));
+ assertThat(info.getMappingFileNames(), hasItems("foo.xml", "bar.xml"));
+
+ System.out.println(info.getPersistenceUnitRootUrl());
+ }
+
+ @Test
+ public void addsOldPersistenceUnitRootUrlIfDifferentFromNewOne() throws MalformedURLException {
+
+ MutablePersistenceUnitInfo newInfo = new MutablePersistenceUnitInfo();
+ newInfo.setPersistenceUnitRootUrl(new URL("file:bar"));
+
+ when(oldInfo.getPersistenceUnitRootUrl()).thenReturn(new URL("file:/foo"));
+
+ MergingPersistenceUnitManager manager = new MergingPersistenceUnitManager();
+ manager.postProcessPersistenceUnitInfo(newInfo, oldInfo);
+
+ assertThat(newInfo.getJarFileUrls().size(), is(1));
+ assertThat(newInfo.getJarFileUrls(), hasItems(oldInfo.getPersistenceUnitRootUrl()));
+ }
+
+ @Test
+ public void doesNotAddNewPuRootUrlIfNull() throws MalformedURLException {
+
+ MutablePersistenceUnitInfo newInfo = new MutablePersistenceUnitInfo();
+
+ when(oldInfo.getPersistenceUnitRootUrl()).thenReturn(new URL("file:/foo"));
+
+ MergingPersistenceUnitManager manager = new MergingPersistenceUnitManager();
+ manager.postProcessPersistenceUnitInfo(newInfo, oldInfo);
+
+ assertThat(newInfo.getJarFileUrls().isEmpty(), is(true));
+ }
+
+ @Test
+ public void doesNotAddNewPuRootUrlIfAlreadyOnTheListOfJarFileUrls() throws MalformedURLException {
+
+ when(oldInfo.getPersistenceUnitRootUrl()).thenReturn(new URL("file:foo"));
+
+ MutablePersistenceUnitInfo newInfo = new MutablePersistenceUnitInfo();
+ newInfo.setPersistenceUnitRootUrl(new URL("file:bar"));
+ newInfo.addJarFileUrl(oldInfo.getPersistenceUnitRootUrl());
+
+ MergingPersistenceUnitManager manager = new MergingPersistenceUnitManager();
+ manager.postProcessPersistenceUnitInfo(newInfo, oldInfo);
+
+ assertThat(newInfo.getJarFileUrls().size(), is(1));
+ assertThat(newInfo.getJarFileUrls(), hasItems(oldInfo.getPersistenceUnitRootUrl()));
}
}
diff --git a/src/test/resources/org/springframework/data/jpa/support/persistence.xml b/src/test/resources/org/springframework/data/jpa/support/persistence.xml
index 230d4bb2a..652dfa4de 100644
--- a/src/test/resources/org/springframework/data/jpa/support/persistence.xml
+++ b/src/test/resources/org/springframework/data/jpa/support/persistence.xml
@@ -1,6 +1,7 @@
+ foo.xml
org.springframework.data.jpa.domain.sample.User
diff --git a/src/test/resources/org/springframework/data/jpa/support/persistence2.xml b/src/test/resources/org/springframework/data/jpa/support/persistence2.xml
index 756e2aa4a..b954da49f 100644
--- a/src/test/resources/org/springframework/data/jpa/support/persistence2.xml
+++ b/src/test/resources/org/springframework/data/jpa/support/persistence2.xml
@@ -1,6 +1,7 @@
+ bar.xml
org.springframework.data.jpa.domain.sample.Role