首页 / 软件开发 / JAVA / 使用Apache OpenJPA开发EJB 3.0应用,第1部分: OpenJPA与EJB 3.0
使用Apache OpenJPA开发EJB 3.0应用,第1部分: OpenJPA与EJB 3.02011-08-31 IBM 肖菁简介:Java Persistence API(JPA)是 EJB 3.0 新引入的数据持久化编程模型,它 利用 Java 5 中的注释(Annotation)和对象/关系映射,为数据持久化提供了更 简单、易用的编程方式。 本系列 文章将全面介绍其开源实现 — Apache OpenJPA,将为学习 JPA 标准和使用 OpenJPA 进行实际的应用开发提供详细的指 南。本文是系列文章的第一部分,概述了关系型数据库和面向对象之间的阻抗失谐 (impedance mismatch),介绍了 EJB 3.0 JPA 标准的相应解决方案,并对 OpenJPA 进行了初步介绍。关系型数据库与面向对象几乎所有的企业应用都需要持久化数据,没有数据持久化需求的企业应用在现 在的市场环境下几乎是不可能出现的。由于关系型数据的普及,通常我们提到数 据持久化时,一般指的是将数据持久化到关系型数据库中。关系型数据是一种结 构化的数据管理方式,开发者只能通过 SQL 来操作数据库。Java 语言天生就是一门面向对象的编程语言,在 Java 的世界中,被处理的 内容都被组织成一个一个的对象,对象和对象之间存在着继承、引用关系,这样 的关系无法通过简单的方式直接反应到关系型数据库中。因此在关系型数据库与 面向对象之间便存在着阻抗失谐(impedance mismatch)。我们通过一个简单的例子来说明这种阻抗失谐给企业应用开发者带来的困难。 假设在企业应用中存在三个 Java 类:Animal、Fish 和 Dog,其中 Fish、Dog 都是 Animal 的子类。在 Java 世界中,Fish、Dog 都可以被作为 Animal 对象 处理。但是如果我们换到关系型数据库中,这三个对象通常都保存在各自对应的 表中,假设分别对应 Animal 表、Fish 表和 Dog 表,如果要维护 Animal 和 Fish 的继承关系,我们就需要使用 SQL 的联合查询语句查出 Animal 的所有属 性和 Fish 的所有属性,并且使用某种外键进行关联:Select animal.*,fish.* form animal,fish where animal.id = fish.id从这个简单的例子中我们就可以看出,一个企业应用开发者需要同时掌握面向 对象和关系型数据库的两种思想,而且还必须保证它们之间的映射是正确的,否 则无法保证企业应用的正确性,这对于企业应用开发者是个挑战,因此 Java 社 区一直在寻求如何将面向对象和关系型数据库思想简单的统一起来的途径,这方 面的努力促进了持久化技术的发展。发展中的持久化技术持久化是企业应用开发的核心需求之一,最近几年以来,它也成为 Java 社区 中最热门的话题之一,在 Java 社区努力解决持久化数据管理的过程中,曾经涌 现出了非常多的技术方案试图解决这个问题,从最早的序列化,到 JDBC、JDO、 ORM、对象数据库、EJB 2.X,然而这些技术都存在着各种各样的局限,影响他们 成为最好的选择。下面我们简单的回顾一下 Java 社区中那些曾经试图为持久化 数据管理提供完整解决方案的技术。序列化序列化是最早出现的、管理持久化数据的实现方案,也是 Java 语言中内置的 数据持久化解决方案。它的工作原理是将对象转化为字节流,生成的字节流能够 通过网络传输或者保存在文件中。序列化非常易于使用,但是局限性也非常大, 由于序列化必须一次将所有对象全部取出,这限制了它在处理大量数据情形下的 应用,同时它也无法在更新失败的情况下撤销对对象的修改,这使它无法用于对 数据一致性要求严格的应用中。多线程或者多个应用不能同时并发地、互不冲突 地读写同一个序列化数据,也不能提供查询功能。JDBC很多企业应用的开发者选择使用 JDBC 管理关系型数据库中的数据。相对序列 化而言,JDBC 克服了很多缺点:它支持处理大量的数据,能够保证数据的一致性 ,支持信息的并发访问,提供 SQL 查询语言查找数据。不幸的是,JDBC 没有提 供序列化所具有的易用性。JDBC 所使用的关系模型不是为保存对象而设计的,因 此迫使开发者选择在处理持久数据时放弃面向对象编程,或者自己去开发将面向 对象特性(比如:类之间的继承)和关系型数据库进行映射的专有解决方案。