`
mzhj
  • 浏览: 228106 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

08、分析JPA与持久化实现产品对接的源代码

阅读更多


    EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
    讲解下这个方法内部的一些原理(了解下就OK)

    打开源代码Persistence.java (用DJ Java Decompiler 3.7反编译的代码)

	// Decompiled by DJ v3.7.7.81 Copyright 2004 Atanas Neshkov  Date: 2010-7-12 20:30:06
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   Persistence.java

package javax.persistence;

import java.io.*;
import java.net.URL;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.persistence.spi.PersistenceProvider;

// Referenced classes of package javax.persistence:
//            PersistenceException, EntityManagerFactory

public class Persistence
{

    public Persistence()
    {
    }

    public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName)
    {
        return createEntityManagerFactory(persistenceUnitName, null);
    }

    public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties)
    {
        EntityManagerFactory emf = null;
        if(providers.size() == 0)
            findAllProviders();	//这个方法是寻找类路径下的所有持久化驱动。
        Iterator i$ = providers.iterator();
        do
        {
            if(!i$.hasNext())
                break;
            PersistenceProvider provider = (PersistenceProvider)i$.next();
            emf = provider.createEntityManagerFactory(persistenceUnitName, properties);
        } while(emf == null);
        if(emf == null)
            throw new PersistenceException((new StringBuilder()).append("No Persistence provider for EntityManager named ").append(persistenceUnitName).toString());
        else
            return emf;
    }

    private static void findAllProviders()
    {
        ClassLoader loader;
        Enumeration resources;
        Set names;
        loader = Thread.currentThread().getContextClassLoader();
        resources = loader.getResources((new StringBuilder()).append("META-INF/services/").append(javax/persistence/spi/PersistenceProvider.getName()).toString());
		  //程序会在类路径的这个目录下查找驱动信息所在的文件。这个文件的详细地址如下图所示:
        names = new HashSet();
_L2:
        InputStream is;
        if(!resources.hasMoreElements())
            break; /* Loop/switch isn't completed */
        URL url = (URL)resources.nextElement();
        is = url.openStream();
        names.addAll(providerNamesFromReader(new BufferedReader(new InputStreamReader(is))));
        is.close();
        if(true) goto _L2; else goto _L1
        Exception exception;
        exception;
        is.close();
        throw exception;
_L1:
        Class providerClass;
        for(Iterator i$ = names.iterator(); i$.hasNext(); providers.add((PersistenceProvider)providerClass.newInstance()))
        {
            String s = (String)i$.next();
            providerClass = loader.loadClass(s);
        }

        break MISSING_BLOCK_LABEL_214;
        IOException e;
        e;
        throw new PersistenceException(e);
        e;
        throw new PersistenceException(e);
        e;
        throw new PersistenceException(e);
        e;
        throw new PersistenceException(e);
    }

    private static Set providerNamesFromReader(BufferedReader reader)
        throws IOException
    {
        Set names = new HashSet();
        do
        {
            String line;
            if((line = reader.readLine()) == null)
                break;
            line = line.trim();
            Matcher m = nonCommentPattern.matcher(line);
            if(m.find())
                names.add(m.group().trim());
        } while(true);
        return names;
    }

    public static final String PERSISTENCE_PROVIDER = "javax.persistence.spi.PeristenceProvider";
    protected static final Set providers = new HashSet();
    private static final Pattern nonCommentPattern = Pattern.compile("^([^#]+)");

}

  


这个资源在哪里呢? 看图:


   

    打开,内容为 org.hibernate.ejb.HibernatePersistence

    程序会在类路径地下寻找到这个文件,并读取这个配置文件里面指定的可持久化驱动。
    Hibernate提供的可持久化驱动就是org.hibernate.ejb.HibernatePersistence这个类,这个类是Hibernate的入口类,类似JDBC里面的驱动类。
    当然,不同的可持久化产品的入口类是不同的。

    调用JPA应用,它能使用Hibernate,是因为有这样一个驱动类,它起到了一个桥梁的作用,过渡到Hibernate的产品上,这就是调用EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); 创建实体管理器方法的一些执行细节。

     factory 是由Hibernate的可持久化驱动类创建出来的,如果观察Hibernate的实现类的话,会发现实际上EntityManagerFactory 是对SessionFactory这个类进行了一层封装。
    包括EntityManager类也是对Session对象进行了一层封装而已。
    只要研究下Hibernate的JPA实现代码就可以观察出来。

 

  • 大小: 74.6 KB
分享到:
评论

相关推荐

    08_传智播客JPA详解_分析JPA与持久化实现产品对接的源代码

    08_传智播客JPA详解_分析JPA与持久化实现产品对接的源代码

    08_JPA详解_分析JPA与持久化实现产品对接的源代码.zip

    通过对这些源代码的深入理解和实践,开发者可以更好地掌握JPA的使用,以及如何根据项目需求选择合适的持久化产品进行对接,提升开发效率并降低维护成本。在实际开发中,结合JPA与其他Java EE技术(如Spring ...

    JPA详解视频教程 第8讲 分析JPA与持久化实现产品对接的源代码.avi

    JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第8讲 分析JPA与持久化实现产品对接的源代码.avi

    传智播客JPA学习笔记.pdf

    分析JPA与持久化实现产品对接的源代码** 理解JPA的底层实现,如Hibernate或EclipseLink的源代码,有助于深入掌握JPA的工作原理和优化技巧。 **9. 使用JPQL语句进行查询** JPQL是JPA的查询语言,类似于SQL,但面向...

    家具商城系统源代码.zip

    【描述】"家具商城系统源代码"指的是开发人员用于构建这样一个平台的编程语言和结构化代码。这通常包括前端用户界面、后端服务器逻辑、数据库交互以及可能的各种第三方服务集成。源代码是软件开发的核心,允许开发者...

    Spring2.0宝典源代码

    9. **与其他框架的集成**:Spring 2.0加强了与其他流行框架的集成,如MyBatis、Struts、JSF等,实现了无缝对接。 通过《Spring2.0宝典》的源代码,学习者可以逐步探索上述功能的实际运用,了解每个特性在项目中的...

    毕业设计-基于Java的在线购物系统的设计与实现(源代码+系统)

    2. **后端技术**:Java作为主要开发语言,使用Spring Boot框架构建微服务,集成Spring MVC处理HTTP请求,同时利用MyBatis或JPA进行数据持久化操作。 3. **数据库**:MySQL或Oracle作为后台数据库,存储商品信息、...

    java抗疫医疗用品销售平台毕业设计源码 (源代码+论文)

    此外,源代码是学习和理解项目实际运作的关键。通过阅读和分析源码,可以深入理解SpringBoot如何与数据库交互,如何实现前后端交互,以及如何处理各种业务逻辑。这对于提升Java Web开发技能,尤其是SpringBoot应用...

    SpringJPAjar包

    Spring JPA jar包是Java开发中的一个重要组件,它主要用于简化持久层的开发工作,尤其是在Java企业级应用中。Spring JPA是Spring Framework的一个模块,它提供了对Java Persistence API(JPA)的集成,使得开发者...

    Java服务端+Vue前端+Android移动端+iOS移动端全栈系列源代码

    这是一个全面的跨平台开发项目,涵盖了Java服务端、Vue前端、Android移动端以及iOS移动端的源代码,旨在提供一套完整的全栈解决方案。以下是针对这些技术栈的知识点详解: **Java服务端** Java作为后端开发的主要...

    基于Java的供应链管理系统设计与代码实现

    2. **数据持久化**:Java的JPA(Java Persistence API)和Hibernate是常见的ORM(对象关系映射)工具,用于将数据库操作转换为面向对象的方式,简化数据库交互。在供应链管理系统中,这有利于管理和存储供应商信息、...

    SpringBoot + Vue + ElementUI 实现一个后台管理系统模板.zip

    同时,Spring Data JPA或MyBatis等持久层框架用于处理数据库操作,简化SQL编写,提高开发效率。 对于前端与后端的通信,通常采用JSON格式的HTTP请求,通过Ajax异步提交数据,实现前后端分离。Vue.js的axios库可以...

    企业开发通用框架:E(易)框架

    持久层采用JPA ,能够很好的适应不同数据库,并实现注解式动态查询功能。 数据响应该采用json格式。 服务采用REST形式,能够方便的与手机app进行对接,集成swagger能够在线查看RESTAPI 文档和在线测试服务接口 支持...

    网上商城项目完整源码

    2. MyBatis:是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。它可以将你从繁琐的低级 JDBC 代码中解脱出来,专注于编写SQL和Java...

    基于SpringBoot的冬奥会科普平台.zip

    通过解压和运行,我们可以深入研究该项目的架构和实现细节,学习如何将SpringBoot与微信小程序对接,以及如何利用SSM实现数据持久化。 首先,SpringBoot是该项目的核心框架,它简化了Spring应用的初始搭建及配置,...

    购物网代码

    这个名为“dangdang”的压缩包很可能包含了上述部分或全部功能的源代码实现,开发者可以通过阅读这些代码学习到如何构建一个完整的B2C购物网站,包括数据库设计、业务逻辑处理、前后端交互等方面的知识。对于想要...

    基于SpringBoot的农商对接系统源码数据库.zip

    【标题】基于SpringBoot的农商对接系统源码数据库是一个以SpringBoot为核心技术构建的农产品商家与销售平台的集成系统。这个系统旨在提供一个高效、便捷的桥梁,连接农业生产者和商业销售者,促进农产品的流通。源码...

    java源码:数据持久层框架 Hibernate.zip

    在这个 `java源码:数据持久层框架 Hibernate.zip` 压缩包中,包含的是 Hibernate 4.1.7.Final 版本的源代码,这为我们提供了一个深入了解其内部工作原理和设计思想的机会。 **一、Hibernate 概述** Hibernate ...

    hibernate-entitymanager-4.3.4.Final.zip

    Hibernate实体管理器是Java开发中用于实现Java持久化层的重要工具,它基于JPA(Java Persistence API)标准,简化了数据库操作。 【描述】提到的"DSpace.zip"是一个与DSpace相关的压缩文件,DSpace是一个开源的数字...

    147-生鲜交易系统--源码.zip

    《147-生鲜交易系统--源码》的压缩包包含了一个完整的生鲜交易系统的源代码,主要用于理解并学习如何构建此类系统。以下是对这个源码的详细解析: 1. **项目结构**: - `147-??????--??\`:这是整个项目的根目录,...

Global site tag (gtag.js) - Google Analytics