首页 理论教育 使用JPA访问NoSQL数据库

使用JPA访问NoSQL数据库

时间:2023-11-20 理论教育 版权反馈
【摘要】:它的产生源于开发人员发现,使用Java这种面向对象的编程语言访问各种不同的关系型数据库需要编写大量重复的代码,不宜于维护。JPA的总体思想和现有的Hibernate、DataNucleus等ORM框架大体一致。JPA支持XML和Java Annotation两种元数据的形式。以笔者的经验,JPA能很好地解决90%的数据库操作。由于JPA提供一个标准接口和关系型数据库交互,而App Engine数据存储区、HBase和AWS SimpleDB并非传统关系数据库,它们的有些功能暂时还不支持JPA使用。

使用JPA访问NoSQL数据库

JPA的全称是Java Persistence API。它的产生源于开发人员发现,使用Java这种面向对象的编程语言访问各种不同的关系型数据库需要编写大量重复的代码,不宜于维护。而类似将需要存储的对象转化为关系型数据库所识别的SQL语句这样的工作可以由专门的框架进行抽象。

Sun公司在Java的早期版本中提出了EJB标准,该标准用来简化Java对象到关系型数据库存储(对象关系映射(Object Relational Mapping,ORM))的开发。但这种标准需要专门的EJB容器,而容器本身的执行效率与开发复杂度都不能很好地满足开发人员的要求。

针对这种情况,广大开发人员开发出了Hibernate、DataNucleus等轻量级的ORM开发组建。使用这种组建开发应用,在大多数情况下,开发人员不需要知道SQL具体该怎么写,而只要调用ORM组建,它就会自动地生成SQL语句。并且此类组建通常支持多种数据库,并屏蔽数据库之间的不同,极大地简化了开发。

随着Hibernte等技术的普及,这些技术也逐渐地被越来越多的开发人员所认同,EJB3.0软件专家组引入了新的JPA规范,作为JSR-220实现的一部分(Java Specification Re-quest,是关于企业JavaBean3.0的规范)。但它并不属于EJB3.0,用户可以在Web应用甚至桌面应用中使用,而不单单是企业应用。

JPA的总体思想和现有的Hibernate、DataNucleus等ORM框架大体一致。总的来说,JPA包括以下两方面的技术。

1.ORM对象关系映射

ORM简言之就是如何将Java类中的字段、名称等与关系数据库中的列名、表名关联在一起。JPA支持XML和Java Annotation(注解式编程)两种元数据的形式。在早期的Hiber-nate实现中,只支持通过XML的方式进行映射。新的版本中加入了对Java Annotation的支持。从编程的角度,笔者比较喜欢使用Java Annotation的方式。这种方式将元数据定义与代码紧密结合,使开发人员对代码进行维护更容易。而使用XML的好处在于更便于进行部署后的调整,在不增加新字段的前提下,可以通过修改XML文件来改变元数据的映射关系。下面使用dataNucleus的ORM来实现映射Java类元数据。假设我们要创建一张表存放产品信息,其Java类如代码清单5-4所示。

【代码清单5-4】

978-7-111-36687-4-Chapter05-8.jpg

如代码清单5-4所示,Product类有id、name和description三个字段,可以将类名映射为表名,字段名映射为列名。下面分别使用Java Annotation与XML两种方式进行映射,读者可以比较一下这两种方式的区别。

通过Java Annotation映射元数据,如代码清单5-5所示。

【代码清单5-5】

978-7-111-36687-4-Chapter05-9.jpg

978-7-111-36687-4-Chapter05-10.jpg

通过XML映射元数据,如代码清单5-6所示。

【代码清单5-6】

978-7-111-36687-4-Chapter05-11.jpg

2.统一标准的数据库编程接口

即便是传统的关系型数据库,也存在不同数据库之间编程接口不统一和SQL标准不一致的情况。

JPA提供统一的数据库编程接口标准来操作实体对象,执行查询、插入、更新、删除等操作,而具体的ORM框架则根据所选定的数据库生成最终的SQL语句,帮助用户完成与数据库的交互,从而可以将开发者从繁琐的SQL代码中解脱出来。

以笔者的经验,JPA能很好地解决90%的数据库操作。但在某些特定情况下,比如处理大数据量、提高特定操作速度等工作,由于JPA提供了统一的接口,对于特殊数据库的优化工作就得由开发人员自己完成。在开发应用时,开发人员要注意这些特殊的情况,根据需要进行优化。(www.xing528.com)

(1)JPA操作GAE数据存储区

GAE Java SDK包含针对其数据存储区的JPA1.0的实现。Google公司并没有自己实现JPA,而是使用了由DataNucleus提供的解决方案

DataNucleus的JPA解决方案有一个比较特殊的地方,即需要映射到数据库的类,以便使用DataNucleus的工具对映射类再次编译。而GAE Eclipse插件替我们做了这件事。

当保存对映射类的修改时,GAE Eclipse插件会自动进行编译,并输出如代码清单5-7所示的信息。

【代码清单5-7】

978-7-111-36687-4-Chapter05-12.jpg

(2)JPA操作HBase

目前,只有DataNucleus提供针对HBase的JPA实现,而且还提供了针对HBase的Eclipse插件。

与GAE的实现类似,用户同样需要编译映射类,通过命令编译映射类如代码清单5-8所示。

【代码清单5-8】

978-7-111-36687-4-Chapter05-13.jpg

或者使用DataNucleus Eclipse插件也可以实现。右击新建的项目→DataNucleus→Run En-hancer Tool,如图5-3所示。

978-7-111-36687-4-Chapter05-14.jpg

图5-3 使用Eclipse编译映射类

所有需要的JPA实现库都可以从http://www.datanucleus.org/下载。

本书需要使用datanucleus-accessplatform-hbase-3.0.0-m2.zip以及Eclipse插件,下载地址http://www.datanucleus.org/downloads/eclipse-update/。

(3)JPA操作AWS SimpleDB

AWSSimpleDB使用SimpleJPA作为JPA实现方案。可从http://code.google.com/p/simplejpa/下载。

与DataNucleus的方案相比,SimpleJPA不需要再次编译映射类。除配置的库文件不同外,它的用法也遵循JPA规范。当用户需要将在DataNucleus下运行的JPA程序迁移到AWS SimpleDB时,一般只需要根据新的配置环境稍微修改代码,在新环境中重新编译即可。

由于JPA提供一个标准接口和关系型数据库交互,而App Engine数据存储区、HBase和AWS SimpleDB并非传统关系数据库,它们的有些功能暂时还不支持JPA使用。当碰到JPA无法满足需要时,用户就要使用这些数据库自带的编程接口来开发程序。本书将以HBase和GAE数据存储区为例进行介绍。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈