使用jadnt158工具将ejb3-persistence.jar\javax\persistence.class进行反编译得到源码:

  1 // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.  2 // Jad home page: http://www.kpdus.com/jad.html  3 // Decompiler options: packimports(3)   4 // Source File Name:   Persistence.java  5   6 package javax.persistence;  7   8 import java.io.*;  9 import java.net.URL; 10 import java.util.*; 11 import java.util.regex.Matcher; 12 import java.util.regex.Pattern; 13 import javax.persistence.spi.PersistenceProvider; 14  15 // Referenced classes of package javax.persistence: 16 //            PersistenceException, EntityManagerFactory 17  18 public class Persistence 19 { 20  21     public Persistence() 22     { 23     } 24  25     public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName) 26     { 27         return createEntityManagerFactory(persistenceUnitName, null); 28     } 29  30     public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) 31     { 32         EntityManagerFactory emf = null; 33         if(providers.size() == 0) 34             findAllProviders(); 35         Iterator i$ = providers.iterator(); 36         do 37         { 38             if(!i$.hasNext()) 39                 break; 40             PersistenceProvider provider = (PersistenceProvider)i$.next(); 41             emf = provider.createEntityManagerFactory(persistenceUnitName, properties); 42         } while(emf == null); 43         if(emf == null) 44             throw new PersistenceException((new StringBuilder()).append("No Persistence provider for EntityManager named ").append(persistenceUnitName).toString()); 45         else 46             return emf; 47     } 48  49     private static void findAllProviders() 50     { 51         ClassLoader loader; 52         Enumeration resources; 53         Set names; 54         loader = Thread.currentThread().getContextClassLoader(); 55         resources = loader.getResources((new StringBuilder()).append("META-INF/services/").append(javax/persistence/spi/PersistenceProvider.getName()).toString()); 56         names = new HashSet(); 57 _L2: 58         InputStream is; 59         if(!resources.hasMoreElements()) 60             break; /* Loop/switch isn't completed */ 61         URL url = (URL)resources.nextElement(); 62         is = url.openStream(); 63         names.addAll(providerNamesFromReader(new BufferedReader(new InputStreamReader(is)))); 64         is.close(); 65         if(true) goto _L2; else goto _L1 66         Exception exception; 67         exception; 68         is.close(); 69         throw exception; 70 _L1: 71         Class providerClass; 72         for(Iterator i$ = names.iterator(); i$.hasNext(); providers.add((PersistenceProvider)providerClass.newInstance())) 73         { 74             String s = (String)i$.next(); 75             providerClass = loader.loadClass(s); 76         } 77  78         break MISSING_BLOCK_LABEL_214; 79         IOException e; 80         e; 81         throw new PersistenceException(e); 82         e; 83         throw new PersistenceException(e); 84         e; 85         throw new PersistenceException(e); 86         e; 87         throw new PersistenceException(e); 88     } 89  90     private static Set providerNamesFromReader(BufferedReader reader) 91         throws IOException 92     { 93         Set names = new HashSet(); 94         do 95         { 96             String line; 97             if((line = reader.readLine()) == null) 98                 break; 99             line = line.trim();100             Matcher m = nonCommentPattern.matcher(line);101             if(m.find())102                 names.add(m.group().trim());103         } while(true);104         return names;105     }106 107     public static final String PERSISTENCE_PROVIDER = "javax.persistence.spi.PeristenceProvider";108     protected static final Set providers = new HashSet();109     private static final Pattern nonCommentPattern = Pattern.compile("^([^#]+)");110 111 }

在如下图所示中:

打开javax.persistence.spi.PersistenceProvider,内容为:org.hibernate.ejb.HibernatePersistence

程序会在类路径地下寻找到这个文件,并读取这个配置文件里面指定的可持久化驱动。Hibernate提供的可持久化驱动就是org.hibernate.ejb.HibernatePersistence这个类,这个类是Hibernate的入口类,类似JDBC里面的驱动类。当然,不同的可持久化产品的入口类是不同的,调用JPA应用,它能使用Hibernate,是因为有这样一个驱动类,它起到了一个桥梁的作用,过渡到Hibernate的产品上,这就是调用EntityManagerFactory factory =Persistence.createEntityManagerFactory("sample");

创建实体管理器方法的一些执行细节
factory 是由Hibernate的可持久化驱动类创建出来的,如果观察Hibernate的实现类的话,会发现实际上EntityManagerFactory 是对SessionFactory这个类进行了一层封装。包括EntityManager类也是对Session对象进行了一层封装而已。

转载于:https://www.cnblogs.com/lich/archive/2011/11/30/2269741.html

JPA基础(八):分析JPA与持久化实现产品对接的源代码相关推荐

  1. JPA基础(四):第一个JPA实例与JPA主键生成策略

    写实体bean,映射的数据可以采用XML配置方式,也可以采用注解方式,在JPA中推荐大家用注解的方式,因为注解的方式开发应用效率是挺高的. 每个实体bean都要有个实体标识属性,这个实体标识属性主要用 ...

  2. JPA基础知识----JPA 基本注解,JPA API

    JPA 是什么     Java Persistence API:用于对象持久化的 API     Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层 JPA和Hib ...

  3. JPA学习笔记1——JPA基础

    1.JPA简介: Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现.JPA是sun提出的一 ...

  4. JPA(Java Persistence API,Java持久化API)

    一.什么是JPA 对象关系映射ORM(Object-Relation Mapping)是用来将对象和对象之间的关系对应到数据库中表与表之间的关系的一种模式.ORM框架能够将Java对象映射到关系数据库 ...

  5. 【中英双语】Java Persistence Hibernate 和 JPA 基础教程

    [中英双语]Java Persistence Hibernate 和 JPA 基础教程 关于 Java Persistence API (JPA) 与 Hibernate 的简单易学和易于理解的课程 ...

  6. Hibernate、JPA、Spring Data JPA,傻傻分不清

    国庆假期接近尾声,明天最后一天了,要开始收收心啦- 今天讲讲一个初学者(或许一些老手)可能没去搞懂的几个概念:Hibernate.JPA.Spring Data JPA 之间的关联. 嘿嘿,前段时间有 ...

  7. JPA入门到精通 - JPA入门

    为什么80%的码农都做不了架构师?>>>    概述 自己用JPA很长时间了,但没有系统学习,通过课程自学下平时比较少碰到的内容,并笔记. JPA概述 什么是JPA JPA是Java ...

  8. JPA学习笔记---JPA理解---第一个JPA程序

    1. a.JPA和Hibernate是sun提出的java持久化的规范.JPA是Hibernate,和TopLink,JDO等ORM框架 基础上发展而来的. b.和jdbc类似,比如刚刚没有jdbc的 ...

  9. SpringData Jpa、Hibernate、Jpa 三者之间的关系

    JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架--因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...

最新文章

  1. RabbitMQ消息路由失败的处理方案(回调与备份交换机AE)
  2. 神器np.unique、np.argsort
  3. Spring五个事务隔离级别和七个事务传播行为
  4. SPOJ 3267: DQUERY 树状数组,离线算法
  5. 设计模式札记——单例模式(Singleton Pattern)
  6. java 压缩 乱码_如何解决java压缩文件乱码问题
  7. ABP入门系列(18)—— 使用领域服务
  8. 牛客网C++面经 容器和算法
  9. 网络 HTTP状态码大全
  10. VMware仅主机网络联网设置
  11. windows下载和安装gcc编译器(MinGW)及其环境配置(C语言编译环境配置)
  12. 关系数据库(范式判断、函数依赖、无损分解、正则覆盖)
  13. python 限定数据范围_python取值范围
  14. 如何定制allure报告的logo
  15. 小米手机更改 MIUI 内测机制,每周必须提交 Bug
  16. COMP SCI 4094/4194/7094 - Distributed Databases and Data Mining
  17. 网络工程项目报价单应该怎么写?记住这6个步骤准没错!
  18. 位地址和字节地址换算_IP地址详解
  19. python openpyxl 获取表头
  20. emacs 使用笔记

热门文章

  1. nicetool好工具_N个办公辅助好工具,无需下载,简单实用
  2. vs2008创建mysql数据库_求教VS2008 C++连接MySQL数据库
  3. vuex ajax dev,vuex中使用ajax的话如何维护状态?
  4. 大学计算机演示文稿作业,(大学计算机作业.doc
  5. php中可以实现多态的是继承,PHP设计模式通过继承实现多态
  6. 儿童吹泡泡水简单配方_儿童吹泡泡水简单配方[组图]
  7. python3生成随机数_Python3.3中如何产生伪随机数
  8. 怎么证明会python_如何在python中验证SSL证书?
  9. 图像降噪算法——小波硬阈值滤波(下)
  10. 笔记:Online robust principal component analysis via truncated nuclear norm regularization