//PersistenceUnitPostProcessor实现类,用于修改PersistenceUnitManager读取到的各个对应persistence.xml产生的PersistenceUnitInfo
package com.iwt.common.persist.jpa;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
import org.springframework.orm.jpa.persistenceunit.PersistenceUnitPostProcessor;
import com.iwt.common.util.CommonUtil;
/**
* 合并多个JAR中的JPA实体到一个持久化单元
*
* This merges all JPA entities from multiple jars. To use it, all entities must be listed in their respective
* persistence.xml files using the tag.
*
* @see http://forum.springsource.org/showthread.php?t=61763 a
* @see http://javathoughts.capesugarbird.com/2009/02/jpa-and-multiple-persistence -units.html b
*/
public class MergingPersistenceUnitPostProcessor implements PersistenceUnitPostProcessor {
Map> puiClasses = new HashMap>();
String persistenceUnitName; //最终返回的持久化单元名字
List includePersistenceUnitNames; //需要过滤的持久化单元名称列表
public MergingPersistenceUnitPostProcessor() {}
public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
String pun = pui.getPersistenceUnitName();
System.out.println(pun);
if(!includePersistenceUnitNames.contains(pun)) {
pui.getManagedClassNames().clear();
}
List classes = puiClasses.get(pun);
if (classes == null) {
classes = new ArrayList();
puiClasses.put(pun, classes);
}
for (List subClasses : puiClasses.values()) {
pui.getManagedClassNames().addAll(subClasses);
}
final List names = pui.getManagedClassNames();
classes.addAll(names);
pui.setPersistenceUnitName(persistenceUnitName);
System.out.println("---------------------------------------------------------------");
System.out.println(pui);
for (String cn : names) {
System.out.println(cn);
}
System.out.println("---------------------------------------------------------------");
}
public void scanEntity() {}
//--------------------------------------------set-----------------------------------------------
public void setIncludePersistenceUnitNames(List includePersistenceUnitNames) {
CommonUtil.checkArgument(includePersistenceUnitNames == null || includePersistenceUnitNames.isEmpty(), "需要合并的持久化单元名称列表不能为空!");
this.includePersistenceUnitNames = includePersistenceUnitNames;
}
public void setPersistenceUnitName(String persistenceUnitName) {
CommonUtil.checkArgument(persistenceUnitName == null || persistenceUnitName.isEmpty(), "合并后的持久化单元名称不能为空!");
this.persistenceUnitName = persistenceUnitName;
}
}
配置方法:
Java代码 收藏代码
class="com.iwt.common.persist.jpa.MergingPersistenceUnitPostProcessor">
huskyPU
huicardPU
huimerchantPU
taskCenterPU