DATAJPA-38 - Introduced MergingPersistenceUnitManager.

This commit is contained in:
Oliver Gierke
2011-04-28 08:09:46 +02:00
parent bafe2ee64e
commit 53c3cf9230
3 changed files with 164 additions and 0 deletions

View File

@@ -708,4 +708,28 @@ public interface UserRepository extends JpaRepository<User, Long> {
thus allow seemless tracking of the auditor.</para>
</simplesect>
</section>
<section id="jpa.misc">
<title>Miscellaneous</title>
<section>
<title>Merging persistence units</title>
<para>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.</para>
<example>
<title>Using MergingPersistenceUnitmanager</title>
<para><programlisting language="xml">&lt;bean class="….LocalContainerEntityManagerFactoryBean"&gt;
&lt;property name="persistenceUnitManager"&gt;
&lt;bean class="….MergingPersistenceUnitManager" /&gt;
&lt;/property
&lt;/bean&gt;</programlisting></para>
</example>
</section>
</section>
</chapter>

View File

@@ -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());
}
}

View File

@@ -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);
}
}