JPA EntityManagerFactory

来源:互联网 发布:阿里云 按流量计费 编辑:程序博客网 时间:2024/05/18 17:44

在使用JPA时,首先要通过Persistence.createEntityManagerFactory创建一个EntityManagerFactory。

对于javax.persistence.Persistence,首先要找到provider,

public static EntityManagerFactory createEntityManagerFactory(            String persistenceUnitName, Map properties) {        EntityManagerFactory emf = null;        if (providers.size() == 0) {            try{                findAllProviders();            } catch (IOException exc){};        }        for (PersistenceProvider provider : providers) {            emf = provider.createEntityManagerFactory(persistenceUnitName, properties);            if (emf != null){                break;            }        }        if (emf == null) {            throw new PersistenceException("No Persistence provider for EntityManager named " + persistenceUnitName);        }        return emf;    }

private static void findAllProviders() throws IOException {        ClassLoader loader = Thread.currentThread().getContextClassLoader();        Enumeration<URL> resources =             loader.getResources("META-INF/services/" + PersistenceProvider.class.getName());        Set<String> names = new HashSet<String>();        while (resources.hasMoreElements()) {            URL url = resources.nextElement();            InputStream is = url.openStream();            try {                names.addAll(providerNamesFromReader(new BufferedReader(new InputStreamReader(is))));            } finally {                is.close();            }        }        for (String s : names) {            try{                providers.add((PersistenceProvider)loader.loadClass(s).newInstance());            } catch (ClassNotFoundException exc){            } catch (InstantiationException exc){            } catch (IllegalAccessException exc){            }        }    }

即首先通过当前线程上下文类加载器去加载META-INF/services/javax.persistence.spi.PersistenceProvider这个文件,进而加载里面的类,例如org.datanucleus.api.jpa.PersistenceProviderImpl ,然后去调用这个provider的createEntityManagerFactory 方法来生成EntityManagerFactory实例。