Java持久化API
Java持久化API(JPA)是一个Java应用程序接口规范,描述了使用Java标准版平台(Java SE)和Java企业版平台(Java EE)的应用中的关系数据的管理。
持久化,在这里包括三个层面的意思:
- API本身,定义在
javax.persistence
包内 - Java持久化查询语言(JPQL)
- 对象/关系元数据
JPA的参考实现是EclipseLink。
历史背景
[编辑]2006年5月11号,JPA 1.0规范作为JCP JSR 220的一部分最终被发布。JPA 2.0规范,在2009年12月发布(Java EE 6平台,依赖于 JPA 2.0)JPA 2.1规范,在2013年4月22日发布(Java EE 7平台,依赖于JPA 2.1[1])。
实体
[编辑]持久化实体是一个轻量级的Java类,其状态通常持久地保存到关系数据库的表中。这种实体的实例对应于表中的各个行。实体之间通常有关系,这些关系通过对象/关系元数据表示。可以在实体类文件中直接使用注释来指定这种关系,也可以在随应用程式分发的单独XML描述文件中指定。
Java 持久化查询语言(JPQL)
[编辑]Java持久化查询语言(JPQL)对存储在关系数据库中的实体进行查询。查询在语法上类似于SQL查询,但是操作的是实体对象而不是直接对数据库表进行操作。
动机
[编辑]在引入EJB 3.0规范之前,许多企业级Java开发人员使用由持久化框架(例如Hibernate)或数据访问对象(DAO)提供的轻量级持久化对象,来代替实体bean(EJB的一种)。 这是因为在以前的EJB规范中,实体bean需要太多复杂的代码和繁重的资源占用,并且由于bean和DAO对象或持久化框架之间的源代码中的互连和依赖性,它们只能在Java EE应用程式服务器中使用。 因此,最初在第三方持久性框架中提供的许多功能都被合并到Java持久化API中,并且从2006年开始,像Hibernate(版本3.2)和TopLink Essentials这样的项目已经实现Java持久化API规范。
相关技术
[编辑]企业 JavaBeans(EJB)
[编辑]EJB 3.0规范(本身是Java EE 5平台的一部分)包含Java持久化API的定义。 无论如何,终端用户不需要EJB容器或Java EE应用程式服务器即可运行使用此持久性API的应用程式。[2] Java持久化 API的未来版本将在单独的JSR和规范中定义,而不是在EJB JSR /规范中定义。
Java持久化API取代了EJB 2.0 CMP(持久化管理容器)的持久性解决方案
Java数据对象的API
[编辑]Java持久化API作为统一Java Data Objects API和EJB 2.0容器管理持久性(CMP)API的一部分来开发。截至2009年,支持这些API的大多数产品都支持Java持久化API。
Java持久化API仅为关系数据库管理系统提供持久化特性。也就是说,JPA专注于对象关系映射(ORM)(请注意,除了关系数据库之外,还有JPA提供程式支持其他数据库模型,但这超出了JPA的设计范围)。有关JPA角色的说明,请参阅JPA 2规范第1节简介,其中非常清楚地说明“这项工作的技术目标是为Java应用程式开发人员提供一个对象/关系映射工具,使用Java领域模型来管理关系数据库。”
Java数据对象规范支持ORM,以及对其他类型的数据库模型的持久化,例如平面文件数据库和NoSQL数据库,包括文档数据库,图形数据库,以及字面上任何其他可想到的数据存储。
服务数据对象 API
[编辑]Java持久化API的设计者旨在提供关系持久化,其中许多关键领域来自对象关系映射工具,如Hibernate和TopLink。Java持久化API改进并取代了EJB 2.0,其体现在EJB 3.0中。服务数据对象(SDO)API(JSR 235)与Java持久化API有着截然不同的目标,被认为是互补的。[3][4]SDO API专为面向服务的体系结构,多种数据格式而非关系数据和多种编程语言而设计。JCP管理SDO API的Java版本;SDO API的C++版本通过OASIS进行管理。
Hibernate
[编辑]Hibernate为Java提供了一个开源的对象关系映射框架。版本3.2及更高版本提供了Java 持久化 API的实现。Gavin King创立了Hibernate项目。[5]他代表JBoss参加JSR 220,这是负责开发JPA的JCP专家组。[6]这引发了围绕JPA和Hibernate之间关系的持续争议和猜测。Sun Microsystems表示[7],这些想法来自几个框架,包括Hibernate和Java 数据对象。
Spring Data JPA
[编辑]抽象存储库的实现是Java应用程式框架Spring的领域驱动设计的关键构建块。透明地支持所有可用的JPA实现,并支持CRUD操作以及方便地执行数据库查询。
JPA 2.0
[编辑]2007年7月,JPA 2.0 在JCP的JSR 317请求中作为新版本开发。2009年12月10日,JPA 2.0被批准为最终正式标准。JPA 2.0的重点是提供一些流行的ORM供应商中存在的特性,但在JPA 1.0中不能获得一致认可。
主要特性包括:
- 扩大对象关系功能的映射
- 支持内嵌对象的收集,通过多对一的关系映射来连接ORM
- 有序列表
- 访问类型的组合
- 一种标准查询API
- 标准化的SQL提示
- 标准化的附加元数据,以支持DDL生成
- 支持验证
- 支持共享对象的高速缓存
支持JPA 2.0的供应商:
- Batoo JPA
- DataNucleus (formerly JPOX)
- EclipseLink (formerly Oracle TopLink)
- IBM, for WebSphere Application Server[8]
- JBoss with Hibernate
- Kundera (页面存档备份,存于互联网档案馆)
- ObjectDB
- OpenJPA
- OrientDB from Orient Technologies
- Versant Corporation JPA (not relational, object database)[9]
JPA 2.1
[编辑]2011年7月,JPA 2.1 在JCP的JSR 338请求中作为新版本开发。2013年5月22日,JPA 2.1被批准为最终正式标准。
主要特性包括:
- 转换器-允许自定义的代码去装换不同的数据库和数据类型。
- 标准Update/Delete-允许通过标准API批量更新和删除。
- 实体图表-允许获取部分或合并对象。
- JPQL/标准增强-算子查询,通用数据库的功能,Join 联合查询,TREAT 选项。
- 模式生成
- 存储过程,允许查询被定义为数据库的存储过程。
支持 JPA 2.1 的供应商:
- DataNucleus
- EclipseLink
- Hibernate
JPA 2.2
[编辑]2017年,JPA 2.2在JCP的JSR 338请求中作为维护版本发布开发。维护审查已于2017年6月19日获得批准。
主要特性包括:
- 给所有有关的注释添加
@Repeatable
- 允许所有JPA注释可用于元的注释。
- 添加查询结果流处理能力
- 允许AttributeConverters的CDI注入
- 支持Java 8的日期和时间类型
支持JPA 2.2的供应商:
- DataNucleus
- EclipseLink(自2.7版本以來)
- Hibernate (自5.3版本以來)
JPA的未来工作
[编辑]未来的JPA规范信息可在此处获得:
- JPA Specification Mailing Lists
- JPA Specification JIRA
2015年11月,Linda DeMichiel在javaee-spec用户邮件中宣布Lukas Jungmann接任规范化主管。Linda的声明还表示,“计划在Java EE 8时间框架内为JPA 2.2做MR”。[10][11][12]
工具
[编辑]- NetBeans Jeddict
- Eclipse JPA(Dali)
参见
[编辑]- .NET Persistence API(NPA)
- JDBC
- MyBatis
- OpenXava
- pureQuery
- SAP NetWeaver Application Server
- XQJ
- ObjectiveSql (页面存档备份,存于互联网档案馆)
参考文献
[编辑]- ^ JavaEE 7 tutorial. Oracle. [2018-07-29]. (原始内容存档于2018-10-02).
- ^ Hibernate EntityManager: Java SE environments (页面存档备份,存于互联网档案馆)
Hibernate EntityManager: Obtaining an EntityManager in a Java SE environment (页面存档备份,存于互联网档案馆) - ^ Barreto, Charlton. SDO and JPA. Digital Walkabout. [5 May 2011]. (原始内容存档于2011-08-13).
- ^ Edwards, Mike. SDO and Java Persistence Architecture (JPA). Open SOA. osoa.org. [5 May 2011]. (原始内容存档于2011-09-29).
- ^ Java Persistence with Hibernate. Manning Publications. [8 December 2013]. ISBN 9781617290459. (原始内容存档于2019-06-05).
Gavin King is the founder of the Hibernate project
- ^ JBoss.com - Industry Leadership. JBoss. [2008-11-17]. (原始内容存档于2012-10-01).
JSR 220, EJB 3.0 Spec Committee, Gavin King, Bill Burke, Marc Fleury
- ^ Java Persistence API FAQ. Sun Microsystems. [2010-07-01]. (原始内容存档于2008-08-22).
The Java Persistence API draws upon the best ideas from persistence technologies such as Hibernate, TopLink, and JDO
- ^ IBM WebSphere Application Server V7 Feature Pack for OSGi Applications and Java Persistence API. Download web site. IBM. 27 April 2010 [8 December 2013]. (原始内容存档于2019-06-10).
- ^ Versant JPA 2-Step Download. Download web site. Actian. [8 December 2013]. (原始内容存档于2013-12-08).
- ^ Java EE Platform Specification: users@javaee-spec.java.net: Archive — Project Kenai. [2016-11-08]. (原始内容存档于2016-11-09).
- ^ Java, JavaOne LIVE - Tuesday, Mission, 2015-10-27 [2016-11-08], (原始内容存档于2019-02-16)
- ^ Jungmann, Lukas. What’s New in the Java Persistence API (JSR 338) [CON7631]. JavaOne 2015 Session Catalog. 10 October 2015 [2016-11-08]. (原始内容存档于2016-11-09) –通过rainfocus.com.
外部链接
[编辑]一般信息
[编辑]- Documentation for the final version of the EJB3 spec (called JSR220) (页面存档备份,存于互联网档案馆)
- GlassFish's Persistence pageArchive.is的存檔,存档日期2013-01-12
- JCP Persistence page (页面存档备份,存于互联网档案馆)
教程
[编辑]- Java EE 6 Persistence API Javadoc(页面存档备份,存于互联网档案馆)
- Java EE 6 Persistence API tutorial (页面存档备份,存于互联网档案馆)
- Java EE 7 Persistence API Javadoc (页面存档备份,存于互联网档案馆)
- Java EE 7 Persistence API tutorial (页面存档备份,存于互联网档案馆)
- JPA Tutorial by Prasad Kharkar (页面存档备份,存于互联网档案馆)
- JPA Tutorial from Java Code Geeks (页面存档备份,存于互联网档案馆)
- JPA Tutorial using OpenJPA as implementation (页面存档备份,存于互联网档案馆)
- Persistence in the Java EE 5 tutorial(页面存档备份,存于互联网档案馆)