一、JPA 简介
JPA 是 Java Persistence API 的简称,中文名 Java 持久层 API,是 JDK 5.0 注解或 XML 描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
Sun 引入新的 JPA ORM 规范出于两个原因:其一,简化现有 Java EE 和 Java SE 应用开发工作;其二,Sun 希望整合 ORM 技术,实现天下归一。
总结:JPA 是 ORM 的一套标准,它是 Sun 公司在 JavaEE 5 中提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具,来管理 Java 应用中的关系数据,JPA 吸取了目前 Java 持久化技术的优点,旨在规范、简化 Java 对象的持久化工作。很多 ORM 框架都是实现了 JPA 的规范,如:Hibernate、EclipseLink。
二、JPA 包括三方面技术
1、ORM 映射元数据 JPA 支持 XML 和 JDK5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
2、API 用来操作实体对象,执行 CRUD 操作,框架在后台替代我们完成所有的事情,开发者从繁琐的 JDBC 和 SQL 代码中解脱出来。
3、查询语言 这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的 SQL 语句紧密耦合。
三、JPA 的优势
1、标准化 JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于 JPA 开发的企业应用能够经过少量的修改就能够在不同的 JPA 框架下运行。
容器级特性的支持 JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
2、简单方便 JPA 的主要目标之一就是提供更加简单的编程模型:在 JPA 框架下创建实体和创建 Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity 进行注释,JPA 的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易地掌握。JPA 基于非侵入式原则设计,因此可以很容易地和其它框架或者容器集成。
3、查询能力 JPA 的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是 Hibernate HQL 的等价物。JPA 定义了独特的 JPQL(Java Persistence Query Language),JPQL 是 EJB QL 的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
4、高级特性 JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。
四、数据库是用 sql 操作的,那用对象操作,由谁来产生 SQL?
答:JPA 实现框架
五、JPA 的实现者
既然我们说 JPA 是一套标准,意味着,它只是一套实现 ORM 理论的接口。没有实现的代码。
那么我们必须要有具体的实现者才可以完成 ORM 操作功能的实现!
市场上的主流的 JPA 框架(实现者)有: Hibernate (JBoss)、EclipseLink(Eclipse 社区)、OpenJPA (Apache 基金会)。
六、关于 JPA 常见问题
1、推荐对主键使用"long"还是"Long"?如果允许使用 null 作为值,将会如何? 答:这实际上取决于您的数据模型。如果您的数据模型允许主键为 null,那么使用 Long,如果您的数据模型规定主键列不能为 null,则使用 long 更合适。总的来说,我认为对于非复合主键,允许 null 作为合法值容易产生混淆,因此我倾向于使用 long,而不是 Long。
2、JPA 是否支持组合主键? 答:JPA 支持自然 ID 和组合 ID,以及数据库指派或实现指派的数字值。
3、JPA 是否支持 JDK1.4? 答:JPA 需要 Java 5 或更新版本。
4、使用范围查询时,它是否也会返回结果总数 (例如,返回 538 项结果中的 1-10 项)? 答:不,要想获得总数,必须发出另外一个查询。通用模式是,在第一次执行搜索时获得总数,然后通过页面浏览结果,将总数存储到方便的位置 (会话状态、cookie 等):

