JPA简介

2014-06-11 summer 更多博文 » 博客 » GitHub »

jpa

原文链接 http://fee.im/2014/06/JPA-introduction/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


写在前面的话

这两天一直在看JPA的相关内容,一下对最近的了解的信息进行整理,以前一直不了解什么是JPA,现在有了清晰的认识以作记录。

JPA是什么

JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

起源

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。 JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。

优势

JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。 JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。 JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。 JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。 JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。

JPA和Hibernate等框架是什么关系

Jpa是一种规范,而Hibernate是它的一种实现。除了Hibernate,还有EclipseLink(曾经的toplink),OpenJPA等可供选择,所以使用Jpa的一个好处是,可以更换实现而不必改动太多代码。 此小节详细处可以参考[http://freewind.me/blog/20111129/588.html]

JPA、Ibatis、Hibernate怎么选择

Ibatis使用场景

iBATIS最好是用在你需要全面地控制SQL的时候,在需要对SQL查询做微调的时候也很有用。当你在应用和数据库设计两方面都有完全的控制权的时候,就不应该使用iBATIS,因为在这样的情况下,应用可能会做出修改以适应数据库,或是反过来。在这种情形中,你可以构建一个完全的对象-关系应用,其他的ORM工具更适于使用,因为iBATIS较为以SQL为中心,其通常被称作反转的——功能齐全的ORM工具生成SQL,而iBATIS直接使用SQL。iBATIS也不适合于非关系型的数据库,因为这类数据库不支持事务和其他iBATIS用到的键特性。

Hibernate使用场景

Hibernate最适合用来作为端到端的OR映射的手段。其提供了一个完整的ORM解决方案,但但是不会让你控制查询。对于那些对应用和数据库两者都有完全的控制权的情况来说,Hibernate是一种理想的解决方案。在这类情况中,你可以修改应用来适用数据库,反之亦然,在这些情况下你可以使用Hibernate来构建一个全对象-关系应用。对于不太熟悉SQL的面向对象编程者来说,Hibernate是最佳选择。

JPA使用场景

JPA应该用在需要标准的基于Java的持久性解决方案的时候。JPA支持继承和多态这两种面向对象编程特性。JPA的缺点是其需要一个实现了其自身的提供程序。这些供应商特有的工具还提供了某些并未定义成JPA规范组成部分的特性,其中一个这样的特性是缓存支持,该功能并未在JPA中做明确定义,但其中一个最流行的实现了JPA的框架Hibernate对这一功能提供了很好的支持。 此外,JPA被定义成只能在关系数据库上工作。如果你的持久化解决方案需要扩展到其他类型的数据存储上,比如XML数据库上的话,则JPA就不能够用来解决你的持久性问题了。 想了解此小节的详细对比及应用可以参考此连接[http://article.yeeyan.org/view/213582/180283]