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与持久化实现产品对接的源代码
通过对这些源代码的深入理解和实践,开发者可以更好地掌握JPA的使用,以及如何根据项目需求选择合适的持久化产品进行对接,提升开发效率并降低维护成本。在实际开发中,结合JPA与其他Java EE技术(如Spring ...
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第8讲 分析JPA与持久化实现产品对接的源代码.avi
分析JPA与持久化实现产品对接的源代码** 理解JPA的底层实现,如Hibernate或EclipseLink的源代码,有助于深入掌握JPA的工作原理和优化技巧。 **9. 使用JPQL语句进行查询** JPQL是JPA的查询语言,类似于SQL,但面向...
【描述】"家具商城系统源代码"指的是开发人员用于构建这样一个平台的编程语言和结构化代码。这通常包括前端用户界面、后端服务器逻辑、数据库交互以及可能的各种第三方服务集成。源代码是软件开发的核心,允许开发者...
9. **与其他框架的集成**:Spring 2.0加强了与其他流行框架的集成,如MyBatis、Struts、JSF等,实现了无缝对接。 通过《Spring2.0宝典》的源代码,学习者可以逐步探索上述功能的实际运用,了解每个特性在项目中的...
2. **后端技术**:Java作为主要开发语言,使用Spring Boot框架构建微服务,集成Spring MVC处理HTTP请求,同时利用MyBatis或JPA进行数据持久化操作。 3. **数据库**:MySQL或Oracle作为后台数据库,存储商品信息、...
此外,源代码是学习和理解项目实际运作的关键。通过阅读和分析源码,可以深入理解SpringBoot如何与数据库交互,如何实现前后端交互,以及如何处理各种业务逻辑。这对于提升Java Web开发技能,尤其是SpringBoot应用...
Spring JPA jar包是Java开发中的一个重要组件,它主要用于简化持久层的开发工作,尤其是在Java企业级应用中。Spring JPA是Spring Framework的一个模块,它提供了对Java Persistence API(JPA)的集成,使得开发者...
这是一个全面的跨平台开发项目,涵盖了Java服务端、Vue前端、Android移动端以及iOS移动端的源代码,旨在提供一套完整的全栈解决方案。以下是针对这些技术栈的知识点详解: **Java服务端** Java作为后端开发的主要...
2. **数据持久化**:Java的JPA(Java Persistence API)和Hibernate是常见的ORM(对象关系映射)工具,用于将数据库操作转换为面向对象的方式,简化数据库交互。在供应链管理系统中,这有利于管理和存储供应商信息、...
同时,Spring Data JPA或MyBatis等持久层框架用于处理数据库操作,简化SQL编写,提高开发效率。 对于前端与后端的通信,通常采用JSON格式的HTTP请求,通过Ajax异步提交数据,实现前后端分离。Vue.js的axios库可以...
持久层采用JPA ,能够很好的适应不同数据库,并实现注解式动态查询功能。 数据响应该采用json格式。 服务采用REST形式,能够方便的与手机app进行对接,集成swagger能够在线查看RESTAPI 文档和在线测试服务接口 支持...
2. MyBatis:是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。它可以将你从繁琐的低级 JDBC 代码中解脱出来,专注于编写SQL和Java...
通过解压和运行,我们可以深入研究该项目的架构和实现细节,学习如何将SpringBoot与微信小程序对接,以及如何利用SSM实现数据持久化。 首先,SpringBoot是该项目的核心框架,它简化了Spring应用的初始搭建及配置,...
这个名为“dangdang”的压缩包很可能包含了上述部分或全部功能的源代码实现,开发者可以通过阅读这些代码学习到如何构建一个完整的B2C购物网站,包括数据库设计、业务逻辑处理、前后端交互等方面的知识。对于想要...
【标题】基于SpringBoot的农商对接系统源码数据库是一个以SpringBoot为核心技术构建的农产品商家与销售平台的集成系统。这个系统旨在提供一个高效、便捷的桥梁,连接农业生产者和商业销售者,促进农产品的流通。源码...
在这个 `java源码:数据持久层框架 Hibernate.zip` 压缩包中,包含的是 Hibernate 4.1.7.Final 版本的源代码,这为我们提供了一个深入了解其内部工作原理和设计思想的机会。 **一、Hibernate 概述** Hibernate ...
Hibernate实体管理器是Java开发中用于实现Java持久化层的重要工具,它基于JPA(Java Persistence API)标准,简化了数据库操作。 【描述】提到的"DSpace.zip"是一个与DSpace相关的压缩文件,DSpace是一个开源的数字...
《147-生鲜交易系统--源码》的压缩包包含了一个完整的生鲜交易系统的源代码,主要用于理解并学习如何构建此类系统。以下是对这个源码的详细解析: 1. **项目结构**: - `147-??????--??\`:这是整个项目的根目录,...