JPA EntityManagerFactory

在使用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实例。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值