1 package org.kuali.student.common.util.spring;
2
3 import java.lang.reflect.Field;
4 import java.util.Map;
5
6 import javax.persistence.spi.PersistenceUnitTransactionType;
7
8 import org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager;
9 import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
10
11 public class MergingPersistenceUnitManager extends
12 DefaultPersistenceUnitManager {
13
14 private String mergedPersistenceUnitName;
15 private PersistenceUnitTransactionType transactionTypeOverride = PersistenceUnitTransactionType.RESOURCE_LOCAL;
16
17 public void setMergedPersistenceUnitName(String mergedPersistenceUnitName) {
18 this.mergedPersistenceUnitName = mergedPersistenceUnitName;
19 }
20
21 @Override
22 protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
23 try {
24 Field persistenceUnitInfosField = DefaultPersistenceUnitManager.class.getDeclaredField("persistenceUnitInfos");
25 persistenceUnitInfosField.setAccessible(true);
26 Map<String, MutablePersistenceUnitInfo> persistenceUnitInfos = (Map<String, MutablePersistenceUnitInfo>) persistenceUnitInfosField.get(this);
27
28 if(persistenceUnitInfos.isEmpty()){
29 pui.setPersistenceUnitName(mergedPersistenceUnitName);
30 pui.setTransactionType(transactionTypeOverride);
31 }else{
32 MutablePersistenceUnitInfo currentlyMergedPui = persistenceUnitInfos.get(mergedPersistenceUnitName);
33 for(String className:pui.getManagedClassNames()){
34 currentlyMergedPui.getManagedClassNames().add(className);
35 }
36 }
37
38 } catch (Exception e) {
39 throw new RuntimeException("Error while merging persistence units.",e);
40 }
41
42 super.postProcessPersistenceUnitInfo(pui);
43 }
44
45 public void setTransactionTypeOverride(PersistenceUnitTransactionType transactionTypeOverride) {
46 this.transactionTypeOverride = transactionTypeOverride;
47 }
48
49
50 }