Java 持久化/什么是 JPA?
Java 持久化 API (JPA) 是一个 Java 规范,用于访问、持久化和管理 Java 对象/类与关系型数据库之间的数据。JPA 被定义为 EJB 3.0 规范的一部分,用于替代 EJB 2 CMP 实体 Bean 规范。JPA 现在被认为是 Java 行业中对象关系映射 (ORM) 的标准行业方法。
JPA 本身只是一个规范,而不是一个产品;它本身无法执行持久化或任何其他操作。JPA 只是一个接口集,需要实现。可以选择开源和商业 JPA 实现,任何 Java EE 5 应用程序服务器都应提供对其使用的支持。JPA 还需要一个数据库来持久化。
JPA 允许 POJO (Plain Old Java Objects) 轻松持久化,而无需类实现任何接口或方法,如 EJB 2 CMP 规范所要求的那样。JPA 允许通过标准注释或 XML 定义对象的对象关系映射,这些注释或 XML 定义了 Java 类如何映射到关系型数据库表。JPA 还定义了一个运行时 EntityManager API,用于处理针对数据库的对象查询和事务。JPA 定义了一个面向对象的查询语言 JPQL,以允许从数据库查询对象。
JPA 是几个 Java 持久化规范中的最新规范。第一个是 OMG 持久化服务 Java 绑定,它从未获得过成功。接下来是 EJB 1.0 CMP 实体 Bean,它在被大型 Java EE 提供商(BEA、IBM)采用方面非常成功,但一些用户对该规范对实体 Bean 的要求过于复杂以及开销和性能低下表示反对。EJB 2.0 CMP 试图通过引入本地接口来降低实体 Bean 的部分复杂性,但大部分复杂性仍然存在。EJB 2.0 还缺乏可移植性,因为定义对象关系映射的部署描述符未被指定,并且都是专有的。
这种反对意见在一定程度上导致了另一个 Java 持久化规范的创建,即 JDO (Java Data Objects)。JDO 获得了一些独立供应商(如 Kodo JDO)的“狂热”追随者,以及几个开源实现,但从未在大型 Java EE 供应商中取得太大成功。
尽管存在 EJB CMP 和 JDO 这两种竞争的 Java 持久化标准,但大多数用户仍然更喜欢专有 API 解决方案,主要是 TopLink (它已经存在了一段时间,并且有自己的 POJO API) 和 Hibernate (它是一个相对较新的开源产品,它也有自己的 POJO API,并且迅速成为开源行业标准)。以前由 WebGain 拥有的 TopLink 产品也被 Oracle 收购,从而增加了其在 Java EE 社区中的影响力。
对 EJB CMP 的反对只是对所有 Java EE 的反对的一部分,Java EE 被认为过于复杂,并促使 Spring 容器等产品的出现。这导致 EJB 3.0 规范的主要目标是降低复杂性,这使规范委员会走上了 JPA 的道路。JPA 的目的是统一 EJB 2 CMP、JDO、Hibernate 和 TopLink 的 API 和产品,并且似乎在实现这一目标方面非常成功。
目前,大多数持久化供应商已经发布了 JPA 实现,从而确认了行业和用户对其的采用。其中包括 Hibernate(被 JBoss 收购,被 Red Hat 收购)、TopLink(被 Oracle 收购)和 Kodo JDO(被 BEA 收购,被 Oracle 收购)。其他已经添加对 JPA 支持的产品包括 Cocobase(由 Thought Inc. 拥有)和 DataNucleus(以前的 JPOX)。