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