1.3 JPA(Java Persistence API)概述
JPA是基于Java持久化的解决方案,主要是为了解决ORM框架的差异,它的出现在某种程度上能够解决目前ORM框架之间不能够兼容的问题,对开发人员来说,能够更好地在JPA规范下进行系统开发。
1.3.1 什么是JPA
JPA全称为Java Persistence API,即Java持久化API,是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。
如图1-3所示说明了JPA在系统架构中的作用,使用JPA持久化对象,而不是依赖于某一个ORM框架。
图1-3 JPA在系统架构中的作用
1.3.2 JPA的历史
JPA规范的起草和发布是JSR 220(Enterprise JavaBeansTM 3.0)官方发布的,其主页是http://www.jcp.org/en/jsr/detail?id=220。目前,JPA的规范被包含在EJB 3规范中,作为EJB持久化中的规范。
JPA规范从起草到最终发布,经历了以下几个阶段。
● 维护草案预览版(Maintenance Draft Review):2007年11月14日至2007年12月17日。
● 最终发布版(Final Release):2006年5月11日。
● 最终版投票(Final Approval Ballot):2006年4月18日至2006年5月1日。
● 建议最终草案版(Proposed Final Draft):2005年12月21日。
● 最终版投票(Final Approval Ballot):2006年4月18日至2006年5月1日。
● 公开核查版投票(Public Review Ballot):2005年8月9日至2005年8月15日。
● 公开核查版(Public Review):2005年6月27日至2005年8月15日。
● 早期草案版2(Early Draft Review 2):2005年2月8日至2005年3月10日。
● 早期草案版(Early Draft Review ):2004年6月30日至2004年7月30日。
● 专家组成立(Expert Group Formation):2003年6月10日至2004年3月24日。
● JSR投票(JSR Review Ballot):2003年5月27日至2004年6月9日。
目前,JPA 2.0(Java Persistence API 2.0)版本已在起草中,其对应的为标准是JSR 317。专家组计划将在2008年的第四季度与Java EE 6规范共同发布。
1.3.3 下载JPA规范
使用浏览器打开“http://java.sun.com/javaee/technologies/”,进入Sun的官方网站下载其规范。如图1-4所示,在该页面上可以下载EJB 3的规范,JPA的规范就包含在其中。
单击该页面的“Download spec”超链接,则进入到下载JPA规范的页面,如图1-5所示。
如果想要使用JPA,则下载图1-5中上方标注的链接;如果想要实现JPA,则下载下方标注的链接。由于实现JPA的规范内容更全面,建议读者下载下面的链接。
单击图1-4中的下载链接后,进入到的页面如图1-6所示。
该页面上有三个文件,其中图1-6中标注的部分为JPA的规范文档,单击该超链接即可下载。
图1-4 JPA规范官方主页
图1-5 下载JPA规范
图1-6 下载JPA规范
1.3.4 JPA的优势
事实上,JPA并不是一项技术,而是一种标准,因为JPA只是一套接口,本身不能完成任何事情。JPA只是规范了Java持久化的官方标准。JPA有以下几个优点。
● 可持久化Java对象。JPA能够直接持久化复杂的Java对象,并能够使用JPQL语言进行复杂的查询。JPQL是JPA专用的查询语言,是类似于SQL的面向对象的查询语言。
● 使用简单。JPA使用注释(Annotation)定义Java对象与关系数据库之间的映射,而传统的ORM多使用XML配置文件。JPA使用起来比ORM要方便。使用JPA不用关注底层使用什么数据库。
● 规范标准化。JPA是JCP组织发布的,是Java官方规定的统一的API。目前已经有多种框架实现JPA标准。使用了JPA的系统可以自由选择遵循JPA标准的框架,并能够自由更换。
● 事务性、大数据量。JPA底层使用关系数据库进行存储,因此具备关系数据库的特点,例如事务性、数据完整性、并发访问、大数据量等。
● 与其他持久化技术相比,JPA有很大的技术优势。表1-1列出了JPA与其他持久化技术的比较。
表1-1 JPA与其他持久化技术的比较
1.3.5 EJB 3与JPA的关系
由于历史的原因,EJB 3与JPA有着藕断丝连的关系。EJB 2.X中,EJB有三种类型的Bean,分别是会话Bean(Session Bean)、实体Bean(Entity Bean)和消息驱动Bean(Message Driven Bean)。
随着EJB 3规范的推出,EJB中的实体Bean(Entity Bean)逐渐被JPA规范所替代,这也正是为什么JPA的规范包含在EJB 3的规范中的原因。但JPA不仅能在EJB环境中使用,也能在J2SE的环境中使用,相对于EJB 2.X中的实体Bean,使用的范围更广阔。
总之,简单地说,JPA虽然出自EJB 3,但其使用的范围却大于EJB 3,不仅可用在Java EE 5.0的环境中,也可以应用在Java SE的环境中。如图1-7所示,清楚地表明了EJB 3与JPA的关系。
图1-7 EJB 3与JPA的关系
1.3.6 常见的实现JPA的框架
目前已经有多个ORM开源框架支持JPA,如Hibernate、TopLink、OpenJPA等。有关这些框架的内容,读者请参阅本书第14章。