diff --git a/src/docbkx/reference/jpa.xml b/src/docbkx/reference/jpa.xml index 120796106..a3ec1f60f 100644 --- a/src/docbkx/reference/jpa.xml +++ b/src/docbkx/reference/jpa.xml @@ -708,4 +708,28 @@ public interface UserRepository extends JpaRepository<User, Long> { thus allow seemless tracking of the auditor. + +
+ Miscellaneous + +
+ Merging persistence units + + Spring supports ahving multiple persistence units out of the box. + But sometimes you might wanna modularize your application but make sure + that all these module run inside a single persistence unit at runtime. + To do so Spring Data JPA offers a PersistenceUnitManager implementation + that automatically merges persistence units based on their name. + + + Using MergingPersistenceUnitmanager + + <bean class="….LocalContainerEntityManagerFactoryBean"> + <property name="persistenceUnitManager"> + <bean class="….MergingPersistenceUnitManager" /> + </property +</bean> + +
+
\ No newline at end of file diff --git a/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java b/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java new file mode 100644 index 000000000..f4e813d2a --- /dev/null +++ b/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java @@ -0,0 +1,81 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.jpa.support; + +import java.net.URL; + +import javax.persistence.spi.PersistenceUnitInfo; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager; +import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo; + + +/** + * Extends {@link DefaultPersistenceUnitManager} to merge configurations of one + * persistence unit residing in multiple {@code persistence.xml} files into one. + * This is necessary to allow the declaration of entities in seperate modules. + * + * @author Oliver Gierke + * @see http://jira.springframework.org/browse/SPR-2598 + */ +public class MergingPersistenceUnitManager extends + DefaultPersistenceUnitManager { + + private static final Logger log = LoggerFactory + .getLogger(MergingPersistenceUnitManager.class); + + + /* + * (non-Javadoc) + * + * @see + * org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager + * # + * postProcessPersistenceUnitInfo(org.springframework.orm.jpa.persistenceunit + * .MutablePersistenceUnitInfo) + */ + @Override + protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) { + + // Invoke normal post processing + super.postProcessPersistenceUnitInfo(pui); + + PersistenceUnitInfo oldPui = + getPersistenceUnitInfo(pui.getPersistenceUnitName()); + + if (oldPui != null) { + postProcessPersistenceUnitInfo(pui, oldPui); + } + } + + + void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui, + PersistenceUnitInfo oldPui) { + + for (URL url : oldPui.getJarFileUrls()) { + + // Add jar file url to PUI + if (!pui.getJarFileUrls().contains(url)) { + log.debug("Adding {} to persistence units", url); + pui.addJarFileUrl(url); + } + } + + pui.addJarFileUrl(oldPui.getPersistenceUnitRootUrl()); + } +} diff --git a/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java b/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java new file mode 100644 index 000000000..c5f6d05ee --- /dev/null +++ b/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java @@ -0,0 +1,59 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.jpa.support; + +import static org.mockito.Mockito.*; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Arrays; + +import javax.persistence.spi.PersistenceUnitInfo; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo; + + +/** + * Unit test for {@link MergingPersistenceUnitManager}. + * + * @author Oliver Gierke + */ +@RunWith(MockitoJUnitRunner.class) +public class MergingPersistenceUnitManagerUnitTests { + + @Mock + PersistenceUnitInfo oldInfo; + + @Mock + MutablePersistenceUnitInfo newInfo; + + + @Test + public void addsUrlFromOldPUItoNewOne() throws MalformedURLException { + + MergingPersistenceUnitManager manager = + new MergingPersistenceUnitManager(); + URL jarFileUrl = new URL("file:foo/bar"); + + when(oldInfo.getJarFileUrls()).thenReturn(Arrays.asList(jarFileUrl)); + manager.postProcessPersistenceUnitInfo(newInfo, oldInfo); + verify(newInfo).addJarFileUrl(jarFileUrl); + } +}