JPA(Java Persistence API)关键在于中间的持久性(persistence),JPA是JDK 5.0注释或XML描述对象-关系表的映射关系将运行期的物理对象持续到数据库中。并非所有Java对象都需要持久性,但大多数应用程序都可以持续关键业务对象。JPA规范允许用户定义哪些对象应该持久,以及如何在Java应用程序中持续这些对象,下文将带大家学习如何从初识精通JPA?赶紧行动起来啊!!
我们可能会错误地认为JPA是一种工具或框架,它经常给我们很大的误解。事实上,JPA本身并非工具或框架;相反,它定义了一组可以由任何工具或框架实施的概念。虽然JPA的对象关系是映射的(ORM)模型最初是基于Hibernate的,但从那以后一直在发展。同样,尽管JPA最初旨在与关系/ SQL数据库一起使用,但一些JPA已经扩展到NoSQL数据存储中。Eclipselink是支持JPA和NoSQL的流行框架,是JPA 2.2参考实现。
说到JPA不得不谈论Hibernate,两者之间的关系贯穿了整个发展过程。由于它们的历史交织在一起,Hibernate和JPA经常结合在一起。但就像Java一样 和Servlet规范一样,JPA产生了许多兼容的工具和框架。Hibernate只是其中之一。
Sun公司引进了新的JPA ORM规范有两个原因:一是简化现有Java EE和Java SE应用开发;其次,Sun希望整合ORM技术,实现世界归一。如今,Hibernate ORM是JPA最成熟的实现之一,仍然是JavaORM的流行选择。Hibernate ORM 5.3.实现了JPA 2.2。此外,Hibernate的工具系列已经扩展到许多流行工具,如Hibernate Search,Hibernate Validator和Hibernate OGM,尽管它们的执行不同,但每个JPA实现都提供一定的ORM层。为了解JPA和兼容JPA的工具,我们需要了解ORM。
对象关系映射是一项任务,开发人员有充分的理由避免手动执行任务。例如Hibernate ORM或Eclipselink等框架将任务编码为库或框架,即ORM层。ORM层作为应用程序系统结构的一部分,负责管理软件对象的转换,并与关系数据库中的表和列进行交互。ORM层将Java类和对象转换为Java,以便在关系数据库中存储和管理它们。默认情况下,保留对象的名称将成为表的名称,字段将成为列。一旦建立了表,每个表行都对应于应用程序中的一个对象。对象映射是可配置的,但默认设置通常可以正常工作。
从编程的角度来看,ORM层是一个适配器层:它使对象图的语言适应性SQL以及关系表的语言。ORM层允许面向对象的开发人员在不离开面向对象示例的情况下构建持久数据软件。使用JPA时,从数据存储区到应用程序创建数据模型对象的映射。不需要定义对象的保存和检索,而是定义对象和数据库之间的映射,然后调用JPA来持久化它们。如果使用关系数据库,应用程序代码与数据库之间的大部分实际连接将由JDBC(Java数据库连接API)处理。
JPA的查询语言是面向对象而不是面向数据库的。它以面向对象的自然语法构建查询语句,可以看作是Hibernatete 等价物HQL。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的扩展是一种针对实体的查询语言,操作对象是实体,而不是关系数据库的表,并可支持批量更新和修改,JOIN、GROUP BY、HAVING 等通常只有 SQL 高级查询特性可以提供,甚至可以支持子查询。JPA 它可以支持面向对象的先进特征,如类之间的继承、多态性和类之间的复杂关系。这种支持可以使开发者最大限度地利用面向对象的模型设计企业的应用,而不需要处理这些特征在关系数据库中的可持续性。
作为规范,JPA提供元数据注释,可用于定义对象与数据库之间的映射。每一个JPA实现都为JPA注释提供了自己的引擎。JPA规范还提供了Persistancemanager或Entitymanager,这是与JPA系统联系的关键。为了更具体地了解这些注释,请参考下面的例子,它是用来建模音乐家的简单数据类。
public class Musician {
private Long id;
private String name;
private Instrument mainInstrument;
private ArrayList performances = new ArrayList();
public Musician( Long id, String name){ /* constructor setters... */ }
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setMainInstrument(Instrument instr){
this.instrument = instr;
}
public Instrument getMainInstrument(){
return this.instrument;
}
// ...Other getters and setters...
}
上述代码中的类别用于保存数据。它可以包含原始数据,如名称字段。它还可以与其他类别保持一致(例如performances与mainstrument和)的关系。
Musician之所以存在,是因为它包含数据。这种类型有时被称为DTO或数据传输对象。DTO是软件开发的常见功能。虽然它们保存多种数据,但它们不包含任何业务逻辑。简单地使用原始字段只是等式的一半。JPA还有能力管理相互关联的实体。表和对象之间可能有四种物理关系:
1.一对多
2.多对一
3.多对多
4.一对一
每种关系类型都描述了一个实体与其他实体之间的关系。例如,Musician实体可以与或以集合表示的实体有一对多的关系。如果Musician包含一个Band字段,那么这些实体之间的关系可能是多对一的,这意味着Musicians在单个Band类别中的集合。假设每个音乐家只在一个乐队表演。)如果Musician包含BandMates字段,则可能表示与其他实体有多对多关系的Musician。
最后,Quote可能与实体有一对一的关系,用来表示一个著名的报价:Quote famousQuote = new Quote()。
每个处理数据库的应用程序都应该定义一个应用程序层,其唯一目的是隔离持久代码。Java Persistence API引入了一系列功能和支持Java对象的持久性。简单的应用程序可能不需要JPA的所有功能,在某些情况下可能不值得配置框架。然而,随着应用程序的增长,JPA的结构和包装突出了优势。使用JPA可以简单地保持目标代码,并提供一个传统的框架来访问Java应用程序中的数据。
能完全理解本文所说的内容,稍加练习就能熟练运用JPA。而且初识精通JPA是一个过程,也不能操之过急,如果你觉得这篇文章不够透彻,你也可以看看这个网站JPA专题视频课程更加深入学习JPA知识。