您的位置:首页 > 其它

JPA EntityManagerFactory

2013-01-28 10:29 731 查看
在使用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实例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: