/** * */ package org.activejpa.jpa; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.spi.PersistenceProvider; import javax.persistence.spi.PersistenceProviderResolverHolder; /** * @author ganeshs * */ public class JPA { public static final JPA instance = new JPA(); private JPAConfig defaultConfig; private Map<String, JPAConfig> configs = new HashMap<String, JPAConfig>(); private String cacheableHint; private static final String HIBERNATE_PERSISTENCE = "org.hibernate.ejb.HibernatePersistence"; private static final String HIBERNATE_JPA_PERSISTENCE = "org.hibernate.jpa.HibernatePersistenceProvider"; private static final String ECLIPSE_PERSISTENCE = "org.eclipse.persistence.jpa.PersistenceProvider"; private static final String OPENJPA_PERSISTENCE = "org.apache.openjpa.persistence.PersistenceProviderImpl"; private JPA() { List<PersistenceProvider> providers = PersistenceProviderResolverHolder.getPersistenceProviderResolver().getPersistenceProviders(); if (providers != null) { String providerClass = providers.get(0).getClass().getCanonicalName(); if (providerClass.equals(HIBERNATE_PERSISTENCE) || providerClass.equals(HIBERNATE_JPA_PERSISTENCE)) { cacheableHint = "org.hibernate.cacheable"; } else if (providerClass.equals(ECLIPSE_PERSISTENCE)) { cacheableHint = "eclipselink.query-results-cache"; } else if (providerClass.equals(OPENJPA_PERSISTENCE)) { cacheableHint = "openjpa.QueryCache"; } } } public void addPersistenceUnit(String persistenceUnitName) { addPersistenceUnit(persistenceUnitName, true); } public void addPersistenceUnit(String persistenceUnitName, boolean isDefault) { addPersistenceUnit(persistenceUnitName, Collections.<String, String>emptyMap(), isDefault); } public void addPersistenceUnit(String persistenceUnitName, Map<String, String> properties, boolean isDefault) { EntityManagerFactory factory = createEntityManagerFactory(persistenceUnitName, properties); addPersistenceUnit(persistenceUnitName, factory, isDefault); } public void addPersistenceUnit(String persistenceUnitName, EntityManagerFactory factory) { addPersistenceUnit(persistenceUnitName, factory, true); } public void addPersistenceUnit(String persistenceUnitName, EntityManagerProvider provider) { addPersistenceUnit(persistenceUnitName, provider, true); } public void addPersistenceUnit(String persistenceUnitName, EntityManagerProvider provider, boolean isDefault) { JPAConfig config = new JPAConfig(persistenceUnitName, provider); if (isDefault) { defaultConfig = config; } configs.put(persistenceUnitName, config); } public void addPersistenceUnit(String persistenceUnitName, EntityManagerFactory factory, boolean isDefault) { addPersistenceUnit(persistenceUnitName, new EntityManagerProviderImpl(factory), isDefault); } public JPAConfig getConfig(String configName) { return configs.get(configName); } /** * @return the defaultConfig */ public JPAConfig getDefaultConfig() { return defaultConfig; } public void close() { List<JPAConfig> confs = new ArrayList<JPAConfig>(); confs.addAll(configs.values()); for (JPAConfig config : confs) { config.close(); configs.remove(config.getName()); } } protected EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map<String, String> properties) { return Persistence.createEntityManagerFactory(persistenceUnitName, properties); } /** * @return the cacheableHint */ public String getCacheableHint() { return cacheableHint; } }