使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx

上传人:b****6 文档编号:17304957 上传时间:2022-12-01 格式:DOCX 页数:91 大小:166.63KB
下载 相关 举报
使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx_第1页
第1页 / 共91页
使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx_第2页
第2页 / 共91页
使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx_第3页
第3页 / 共91页
使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx_第4页
第4页 / 共91页
使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx_第5页
第5页 / 共91页
点击查看更多>>
下载资源
资源描述

使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx

《使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx(91页珍藏版)》请在冰豆网上搜索。

使用 Apache OpenJPA 开发 EJB 3Word格式文档下载.docx

发展中的持久化技术

持久化是企业应用开发的核心需求之一,最近几年以来,它也成为Java社区中最热门的话题之一,在Java社区努力解决持久化数据管理的过程中,曾经涌现出了非常多的技术方案试图解决这个问题,从最早的序列化,到JDBC、JDO、ORM、对象数据库、EJB2.X,然而这些技术都存在着各种各样的局限,影响他们成为最好的选择。

下面我们简单的回顾一下Java社区中那些曾经试图为持久化数据管理提供完整解决方案的技术。

序列化

序列化是最早出现的、管理持久化数据的实现方案,也是Java语言中内置的数据持久化解决方案。

它的工作原理是将对象转化为字节流,生成的字节流能够通过网络传输或者保存在文件中。

序列化非常易于使用,但是局限性也非常大,由于序列化必须一次将所有对象全部取出,这限制了它在处理大量数据情形下的应用,同时它也无法在更新失败的情况下撤销对对象的修改,这使它无法用于对数据一致性要求严格的应用中。

多线程或者多个应用不能同时并发地、互不冲突地读写同一个序列化数据,也不能提供查询功能。

JDBC

很多企业应用的开发者选择使用JDBC管理关系型数据库中的数据。

相对序列化而言,JDBC克服了很多缺点:

它支持处理大量的数据,能够保证数据的一致性,支持信息的并发访问,提供SQL查询语言查找数据。

不幸的是,JDBC没有提供序列化所具有的易用性。

JDBC所使用的关系模型不是为保存对象而设计的,因此迫使开发者选择在处理持久数据时放弃面向对象编程,或者自己去开发将面向对象特性(比如:

类之间的继承)和关系型数据库进行映射的专有解决方案。

关系对象映射(ObjectRelationalMapping,ORM)

ORM是目前完成对象和关系数据表之间的映射最好的一种技术,这些ORM框架处理对象和关系数据库之间的协调工作,将开发者从这部分工作中解脱出来,集中精力处理对象模型。

阻碍ORM发展的问题是,现有的每一种ORM产品都有自己特有的API,开发者只能将自己的代码绑定到某一个框架提供商的接口上,这种状况形成了厂商锁定,意味着一旦该框架提供商无法解决系统中出现的严重错误,或者因为其它的原因转而采用其它的框架,将会给开发者的企业应用带来极大的困难,唯一的解决办法是重写所有的持久化代码。

对象数据库(ObjectDataBase)

已经有一些软件公司选择了开发为保存对象而特别设计的对象数据库,而不是选择将对象映射到关系型数据库上。

这种解决方案通常比使用对象/关系映射更加易于使用。

和ORM相同的问题是,对象数据库的访问接口并没有标准化,因此非常容易形成厂商锁定的局面。

与此同时,放弃已经成熟的关系数据库而转向未知的对象数据库让非常多的企业决策者犹豫不决。

而且目前为对象数据库而设计的分析工具太少,无法满足企业的需求。

而且现实情况下,每一个企业基本上都有大量的已有数据保存在关系数据库中,要从关系数据库转向对象数据库对企业而言也需要大量工作。

EJB2.X

EJB2.X实体Bean是管理持久化数据的组件框架,和ORM解决方案一样,EJB2.X实体Bean提供持久化数据的面向对象视图。

和ORM解决方案不一样的是,EJB2.X实体Bean不仅仅局限于数据库,它展示的信息可能来自于EIS(EnterpriseInformationSystem)或者其他持久化设备。

EJB2.X实体Bean最大的局限是规定了太过于严格的标准,这些标准保证了企业应用能够在不同的EJB容器之间可以移植,但是也让EJB2.X实体Bean规范变得非常复杂并难于使用。

而且EJB2.X标准在面向对象特性处理方面的支持非常有限,无法支持继承、多态和复杂关系等面向对象的高级特性。

EJB2.X实体Bean只能在重量级的、价格昂贵的EJB容器中运行,这对应用EJB2.X实体Bean开发企业应用提出了更高的要求,加重了企业的经济压力。

Java数据对象(JavaDataObject,JDO)

JDO是JavaEE标准中另外一个支持管理持久化数据的规范,JDO规范使用和JPA非常类似的API,只是通常是通过JCA技术集成到应用服务器上。

但是JDO是针对轻量级容器而设计的,不能够支持容器级别的声明式安全、事务特性,也无法对远程方法调用提供支持。

EJB3.0规范

2006年5月2日,EJB3.0规范最终版由JCP(JavaCommunityProcess)正式公布,标准号为JSR(JavaSpecificationRequest)220。

EJB3.0规范的发布为企业应用开发者提供了一种全新的、简化的API。

制定这组API的目标是让开发变得更加容易,相对于以前版本的EJB规范,这组API也更加简单。

JavaPersistenceAPI是EJB3.0中负责处理持久化数据管理的部分,目标是为开发者处理持久化数据库管理提供标准支持,也成为JavaEE容器提供商必须遵守的标准。

EJB3.0规范由三部分组成:

EJB3.0SimplifiedAPI、EJB核心规范(EJBCoreContractsandRequirements)和JPA(JavaPersistenceAPI)。

SimplifiedAPI

SimplifiedAPI部分主要规定了基于EJB3.0标准开发企业应用时所需要遵守的Bean类和接口要求、这些API的使用方式以及容器支持等多方面的内容。

还详细的规定了EJB3.0中除JavaPersistenceAPI部分之外的EJB实现所支持的注释(Annotation)。

规范中还有专门章节讲解EJB3.0和此前的EJB规范如何同时工作,以及如何将此前已经开发好的企业应用移植到EJB3.0容器中。

其中的Persistence的内容放在了JPA规范中。

EJB核心规范

EJB核心规范中首先描述了EJB在企业应用中的角色、EJB规范的体系结构,确定了支持EJB标准的容器应该遵守的准则和要求。

随后从多个角度详细的介绍了EJB体系中各部分的功能需求和实现要求,包括SessionBean、消息驱动Bean(Message-DrivenBean)、事务、安全管理、部署描述符等。

由于EJB3.0规范并不排斥之前的EJB规范,因此EJB2.X和EJB1.X中的内容也保留在了EJB核心规范中。

JavaPersistenceAPI(JPA)

EJB2.X和EJB1.X规范中的实体Bean(EntityBean)部分都难以使用,使持久化成为EJB规范的一个软肋,影响了EJB标准发挥更大的作用,自然而然的,JPA成为了EJB3.0规范中被关注最多的部分。

JPA规范部分详细的介绍了JPA中实体Bean新的定义,并介绍了实体Bean支持的注释、全新的查询语言、实体管理接口、容器实现规范等内容。

JPA标准中引入了新的实体概念,每一个实体都是一个普通的Java类,不需要继承任何其他的接口或者扩展某个指定类,这个Java类必须使用javax.persistence.Entity进行注释。

JPA标准中还提供了包括javax.persistence.Table、javax.persistence.Id等在内的多个注释,用于完成实体和数据库之前的映射。

JPA中引入了新的查询语言JPQL(JavaPersistenceQueryLanguage),JPQL允许开发者采用面向对象的查询语言来查找实体,这些实体持久化在关系型的数据库中,”selectafromAnimalawherea.name=’a’”是一个JPQL的例子。

其中的Animal是一个Java类,而不是关系型数据库中的一个表或者视图。

除了简单的查询功能之外,JPQL中还能够支持Group、Order等通常只有SQL才能提供的高级功能。

JPA标准中还规定了在JavaEE环境中和非JavaEE环境中使用JPA时的差异,以及JavaEE环境中容器的职责等。

JPA体系架构

JPA中定义一套类和接口用于实现持久化管理和对象/关系的映射,下面这张图中显示了JPA的主要组件以及它们之间的相互关系。

图1JPA主要组件和相互关系

∙EntityManagerFactory

EntityManagerFactory是EntityManager的工厂类,负责创建EntityManager对象。

∙EntityManager

EntityManager是JPA应用中使用的基本对象,通过它提供的相应方法可以管理持久化对象,也可以新建或者删除持久化对象。

EntityManager还负责创建Query实例。

在容器外使用时,EntityManagerFactory和EntityManager之间是一对一的关系。

∙Entity

EntityTransaction提供Entity操作时需要的事务管理,和EntityManager是一对一的关系。

在查询操作时不需要使用EntityTransaction,而在对象持久化、状态更新、对象删除等情况下则必须使用显式的使用EntityTransaction的相关方法管理事务。

∙Query

Query是查询实体的接口,Query对象可以从EntityManager中获得。

根据EJB3.0规范中的描述,Query接口需要同时支持JPQL和原生态SQL两种语法。

∙Persistence

Persistence是一个工具类,负责根据配置文件提供的参数创建EntityManagerFactory对象。

下面的代码演示了如何通过JPA提供的接口和JPQL查询语言完成实体查询和更新的例子,例子中的代码假定运行在非JavaEE环境中。

清单1在非JavaEE环境使用JPA接口的例子

1./*

2.*Persistence类获取EntityManagerFactory实例;

3.*一般EntityManagerFactory实例被缓存起来重复使用,

4.*避免重复创建EntityManagerFactory实例引起的性能影响

5.*/

6.EntityManagerFactoryfactory=

7.Persistence.createEntityManagerFactory(“mysql”);

8.

9.//从EntityManagerFactory实例factory中获取EntityManager

10.EntityManagerem=factory.

11.createEntityManager(PersistenceContextType.EXTENDED);

12.

13.//实体的更新需要在事务中运行

14.EntityTransactiontx=em.getTransaction();

15.tx.begin();

16.

17.//查找所有公司中的女性雇员

18.Queryquery=em.createQuery("

selectefromEmployeee"

19.+"

wheree.sex='

femail'

"

);

20.Listresults=query.getResultList();

21.

22.//给所有女性雇员增加半天假期

23.for(Objectres:

results){

24.Employeeemp=(Employee)res;

25.emp.setHoliday(emp.getHoliday()+0.5);

}

26.

27.//提交事务(持久化所有更新)

28.mit();

29.em.close();

30.factory.close();

下面的代码显示了在EJB容器中开发JPA应用时的接口使用情况,由于容器中的EntityManager是注入的,事务也是声明式的,因此在容器中完成上面的业务逻辑要简单得多。

清单2在容器中运行的JPA例子

2.*在容器中运行JPA应用时,EntityManager接口的实例”em”

3.*是通过@Resource注释注入的。

事务也通常是声明式的。

4.*/

5.//查找所有公司中的女性雇员

6.Queryquery=em.createQuery("

7.+"

8.Listresults=query.getResultList();

9.

10.//给所有女性雇员增加半天假期

11.for(Objectres:

12.Employeeemp=(Employee)res;

13.emp.setHoliday(emp.getHoliday()+0.5);

JPA的优势

JPA标准制定过程中充分吸收了目前已经出现的所有持久化技术的所有优点,摒弃了它们存在的局限,使JPA在简单易用、查询能力等方面表现突出。

标准化

JPA是JCP组织发布的JavaEE标准之一,因此任何声称符合JPA标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。

对容器级特性的支持

JPA框架中支持大数据集、事务、并发等容器级事务,这使得JPA超越了简单持久化框架的局限,在企业应用发挥更大的作用。

简单易用,集成方便

JPA的主要目标之一就是提供更加简单的编程模型:

在JPA框架下创建实体和创建Java类一样简单,没有任何的约束和限制,只需要使用javax.persistence.Entity进行注释;

JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。

JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。

可媲美JDBC的查询能力

JPA定义了独特的JPQL(JavaPersistenceQueryLanguage),JPQL是EJBQL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUPBY、HAVING等通常只有SQL才能够提供的高级查询特性,甚至还能够支持子查询。

支持面向对象的高级特性

JPA中能够支持面向对象的高级特性,比如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。

下面的这个表格中列出了当前常用持久化技术的优缺点。

表1持久化技术的优缺点

支持内容:

序列化

JDBC

ORM

ODB

EJB2.X

JDO

EJB3(JPA)

Java对象

Yes

No

Yes

高级OO原理

No

事务完整性

并发

大数据集

现有Schema

关系型和非关系型数据存储

查询

严格的标准/可移植

简单易用

OpenJPA简介

OpenJPA是Apache组织提供的开源项目,它实现了EJB3.0中的JPA标准,为开发者提供功能强大、使用简单的持久化数据管理框架。

OpenJPA封装了和关系型数据库交互的操作,让开发者把注意力集中在编写业务逻辑上。

OpenJPA可以作为独立的持久层框架发挥作用,也可以轻松的与其它JavaEE应用框架或者符合EJB3.0标准的容器集成。

除了对JPA标准的支持之外,OpenJPA还提供了非常多的特性和工具支持让企业应用开发变得更加简单,减少开发者的工作量,包括允许数据远程传输/离线处理、数据库/对象视图统一工具、使用缓存(Cache)提升企业应用效率等。

数据远程传输/离线处理

JPA标准规定的运行环境是"

本地"

和"

在线"

的。

本地是指JPA应用中的EntityManager必须直接连接到指定的数据库,而且必须和使用它的代码在同一个JVM中。

在线是指所有针对实体的操作必须在一个EntityManager范围中运行。

这两个特征,加上EntityManager是非序列化的,无法在网络上传输,导致JPA应用无法适用于企业应用中的C/S实现模式。

OpenJPA扩展了这部分接口,支持数据的远程传输和离线处理。

数据库/对象视图统一工具

使用OpenJPA开发企业应用时,保持数据库和对象视图的一致性是非常重要的工作,OpenJPA支持三种模式处理数据库和对象视图的一致性:

正向映射(ForwardMapping)、反向映射(ReverseMapping)、中间匹配(Meet-in-the-MiddleMapping),并且为它们提供了相应的工具支持。

∙正向映射是指使用OpenJPA框架中提供的org.apache.openjpa.jdbc.meta.MappingTool工具从开发者提供的实体以及在实体中提供的对象/关系映射注释生成相应的数据库表。

∙反向映射是指OpenJPA框架中提供的org.apache.openjpa.jdbc.meta.ReverseMappingTool工具从数据库表生成符合JPA标准要求的实体以及相应的对象/关系映射注释内容。

∙中间匹配是指开发者负责创建数据库表、符合JPA标准的实体和相应的对象/关系映射注释内容,使用OpenJPA框架中提供的org.apache.openjpa.jdbc.meta.MappingTool工具校验二者的一致性。

使用缓存提升效率

性能是企业应用重点关注的内容之一,缓存是提升企业系统性能的重要手段之一。

OpenJPA针对数据持久化提供多种层次、多方面的缓存支持,包括数据、查询、汇编查询的缓存等。

这些缓存的应用可以大幅度的提高企业应用的运行效率。

总结

本文中,我们回顾了关系型数据库和面向对象之间的阻抗失谐问题和Java社区中为解决对象持久化而做出的努力,这些努力促进了Java中对象持久化的发展,但是没有任何一种技术象EJB3.0标准中的JPA标准来的这么简单和高效。

JPA标准中使用注释声明数据库表和对象之间的映射,开发者通过操作实体就可以完成对数据库的操作。

OpenJPA是Apache组织提供的开源项目,它实现了EJB3.0中的JPA标准

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1