Kevin Sutter 评论: Java Persistence API 2.0 更新

在 JPA 专家组 (JSR-317) 即将完成 JPA 2.0 规范之际,本文为您介绍了此最新规范中的一些新概念和特性。它还介绍了如何通过 Apache OpenJPA 项目体验这一新功能 —— 一个开源、健壮、高性能、可扩展的 JPA 规范实现。 本文来自于 IBM WebSphere Developer Technical Journal

Kevin Sutter, 高级软件工程师, EMC

http://www.ibm.com/developerworks/i/p-ksutter.jpg Kevin Sutter 是 WebSphere Application Server 开发团队的高级软件工程师。他目前是 WebSphere Application Server 的 Java Persistence API 解决方案的首席架构师。Kevin 还是 Apache OpenJPA 项目的 PMC 的提交人和成员。Kevin 曾领导并参与了面向 J2EE Connector Architecture (JCA) 和 WebSphere eXtremeScale(缓存框架)的 WebSphere 解决方案的设计工作。



2009 年 11 月 25 日

力争更全面、更出色

Java™ Persistence API (JPA) 最初引入到了 Java Platform Enterprise Edition (Java EE) 5 中,作为 规范 的 Enterprise JavaBean™ (EJB) 3.0 家族的一部分。 自那时起,JPA 1.0 逐渐成为流行的持久性框架。即使这一最初的规范已经很全面且功能很强大了,但是总会有一些改进的空间。下一代的 JPA 规范(JPA 2.0)目前正在 JSR 317 的开发中。

JPA 专家组正在努力最终确定 JPA 2.0 规范。规范的 Public Final Draft #2 最近已经发布了,而最终的 JPA 2.0 规范计划于 2009 年 11 月 16 日发布。

一个评论专栏无法全面介绍 JPA 2.0 规范中的所有新特性。因此,本文对这些特性进行了简介,并提供了一些信息帮助您通过 Apache 的 OpenJPA 项目亲身体验这些特性。


持久性

正如我前面说过的,第一个 JPA 规范功能上已经比较完整了。 JPA 2.0 中引入的很多新特性 —— 特别是对象/关系(O/R)映射和域建模方面的特性 —— 都是针对 “边缘” 情况的;这些场景仍然在行业中存在是由于有遗留的应用程序和模式,但是这些不是正常的日常场景类型。其他主要新特性,比如 Criteria APIs 以及与 Bean Validation 框架的整合,只是对 JPA 的持久性功能锦上添花而已。

下面,让我们仔细检查这些特性:

  • O/R 映射和域建模
    • JPA 2.0 的几个新增功能都属于 O/R 映射和域建模领域。扩展了 embeddables 的定义和用法,使其包含 embeddables 集合、嵌套式 embeddables 和包含到其他实体关系的 embeddables。当然,还更新了 Java Persistence Query Language (JPQL) 以支持这些增强的嵌入式功能。
    • Access 类型(@Access)也在 JPA 2.0 中进行了扩展,以在每个持久性类型上、或者甚至在单独的属性上启用规范。当您架构您的实体定义和使用这些实体的关联应用程序时,这些更改提供了更多灵活性。
    • 在 JPA 2.0 中,除了现有的 OneToMany、ManyToOne 和 ManyToMany 关系,还增强了 ElementCollections 的映射支持。与此增强的映射集合支持相关的是针对 MapKeyColumn、MapKeyClass 和 MapKeyJoinColumn 的关联注释。另外,更新了 JPQL 以支持这些新功能。
    • JPA 2.0 中另一个与域建模相关的新功能是 derived identities(派生身份)的定义。这使实体的 ID 能够从其他实体派生出来,这提供了 parent-to-dependent 关系。JPA 2.0 规范中有几页(2.4 节)是关于派生身份场景的。
  • JPA 运行时

    JPA 2.0 中有几个基本的 JPA API 需要更新: EntityManagerFactoryEntityManagerQuery。幸好,这些更新以向上兼容的方式进行,使得迁移无论从应用程序的角度还是从 JPA 提供商的角度来说都会更加平滑。这些 API 更新中的很多都与访问主要的新 JPA 2.0 特性有关,比如 Metamodel 和 Criteria API(稍后会详细介绍它们),但也有一些其他的运行时特性值得一提:

    • JPA 2.0 的一个新特性就是引入 pessimistic LockManager。JPA 1.0 仅定义了乐观锁(optimistic locking)语义,但是真正的企业级应用有时还需要更严格的悲观锁(pessimistic locking)功能。悲观锁语义的应用可以通过各个 EntityManager 或 Query 方法中的 LockModeType 指定。(Apache OpenJPA 以前提供了 openjpa.LockManager 属性和 ReadLockMode hint,可以用于在 OpenJPA 内进一步配置悲观锁语义。)
    • 另一个新的 JPA 2.0 运行时更新提供了对 JPA 提供商的二级缓存的访问,如果缓存可用的话。JPA 2.0 仍然不需要 JPA 提供商实际提供二级缓存,规范也没定义如何插入或利用二级缓存。但是如果缓存可用,这一新 API 和相关注释会帮助管理二级缓存的内容。(顺便说一下,针对第三方缓存实现,Apache OpenJPA 确实提供了二级缓存插件。)
  • Metamodel 和 Criteria APIs

    JPA 2.0 中最令人兴奋的功能之一是 Metamodel 和 Criteria API 的组合。Criteria API 支持使用基于对象的查询图以编程方式构建查询。Criteria API 提供了 JPQL 的动态替代方案:不用再使用基于字符串的类和方法创建和操纵 JPQL 查询,现在可以使用 Criteria API 以编程方式创建和操纵查询。

    但是真正使 Criteria API 强大的是该 API 的类型安全功能。类型安全功能将提供在编译时的早期错误检测,而不是使用标准 JPQL 构建时的运行时检测。Metamodel API 和接口是类型安全功能的基础。Metamodel API 可以用于动态访问持久性单元的元模型信息。这些元模型结构可以静态或动态生成。

  • Bean 验证

    支持 bean 验证 是 JPA 2.0 的另一个主要特性,它扩展到了容器管理和应用管理环境。Bean 验证可用于提供可选的实体验证,基于注释和 XML 限制、验证组和 JSR-303 规范定义组序列。现有的针对 PrePersist、PreUpdate 和 PreRemove 的 JPA 生命周期事件提供了到 bean 验证框架的挂钩点。JPA 提供商也负责提供 TraversableResolver 来确保遵守受管理对象属性和实体关系的获取方案。


Apache OpenJPA

如何体验所有这些很棒的 JPA 2.0 新功能? JPA 2.0 规范的一个开源开发工作是 Apache OpenJPA 项目,该项目提供了 WebSphere Application Server JPA 解决方案的基础。

在 OpenJPA 2.0 路线图 中您可以看到,自 2008 年 12 月以来开发工作很活跃。定义并交付了几个迭代和里程碑。如果需要最新最好的功能,我们还提供了夜间驱动程序(nightly drivers)。这些夜间 2.0 驱动程序经过了全面的回归测试,因此用于开发时可以对其稳定性完全放心。如果需要更多保障,Milestone 驱动程序也推出了。最新的 Milestone 驱动程序基于 JPA 2.0 规范的 Early Access 版。一旦 JPA 2.0 Proposed Final Draft #2 公之于众,我们将会推出另一个 Milestone 驱动程序。查看 OpenJPA 主页或新闻页寻找提供的更新。

这些早期的 OpenJPA 2.0 驱动程序有什么用?

Apache OpenJPA 路线图中记录的所有东西都是开发的对象。通过每一次新功能的整合,相应的 JUnit 测试和相关的文档更新也进行了整合。有望在规范、OpenJPA 实现、测试用例和文档之间提供足够的背景信息,以便您能在实践中学习 JPA 2.0 新功能。

如果一直关注 JPA 2.0 专家组,您会知道这是个持续的目标。JPA 专家组每周都在不断修改规范和相关 API,尽管由于最终版本即将出炉修改的速度正在减慢。当然,由于这些持续的变更,应该意识到 OpenJPA 实现可能与专家组目前的进展不是完全同步的,因此在 JPA 专家组交付最终规范之前可能会发生某些差异。

在您体验这些 JPA 2.0 新功能时,OpenJPA 社区渴望得到您的建议。无论是发现了潜在的 bug 还是对规范的误解,或者是对驱动程序的其他反馈,您的意见可以发送到我们的 User 或 Dev 邮件列表,这将对我们的工作产生积极有益的影响。当然,如果发现了明显的 bug,不要犹豫创建 JIRA Issues。我们希望这一版的 OpenJPA 2.0 能够尽可能的全面,因此我们十分乐于接受和期待着早期客户的反馈。


性能和数据库支持

性能总是很受关注,尤其是要在稳定的运行时库(比如 OpenJPA 1.2.x)中引入如此多的新功能时。 我们一直在监控这些新功能的性能方面以及它们对现有 JPA 1.0 功能的影响。我们不仅不希望带来任何性能倒退,而且我们的目标是能够改进现有代码库的性能。当然,我们也一直在测量和监控新特性的性能。

我们还一直致力于改善和扩展数据库支持。当然,从 IBM 的角度而言,我们在努力实现其对 IBM DB2®、Informix®、Derby 甚至 solidDB® 的最佳支持。 OpenJPA 还提供了对 Oracle 和 Microsoft® SQL Server 的支持。最近提交的更新还改善了对 PostgreSQL 和 MySQL 的支持。OpenJPA 文档概括了数据库支持的广度。我们不断对主要数据库运行全面的 OpenJPA 2.0 测试 bucket 以确保所有新功能的覆盖面。


结束语

希望本文能够引起您对 JPA 2.0 及相关 Apache OpenJPA 2.0 实现的兴趣。整个 JPA 2.0 工作还在进行中,但是随着在 11 月份推出最终版本以及其后不久应发布完全合乎规范的 OpenJPA 2.0 目标的临近,规范将日益完善。

参考资料

学习

获得产品和技术

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Java technology
ArticleID=449607
ArticleTitle=Kevin Sutter 评论: Java Persistence API 2.0 更新
publish-date=11252009