http://developer.51cto.com/art/200906/130500.htm JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。本文将对比JPA与Hibernate的优缺点。
 

Java Persistence API

从 EJB 技术可以开始应用时起,对其在实际应用中的可用性就一直存在怀疑。在我看来,产生这种现象最重要的两个原因是复杂性和资源密集性。结果,随后出现了比 EJB 更简单、具有更小资源空间的框架(比如 Spring 和 Hibernate),并且更快流行开来。为了说明这一点,我们注意到 EJB 3.0 规范的方向相对以前出现了一个主要的转变。作为 JSR 220 的一部分,该规范提供了类似 Plain Old Java Object (POJO) 支持、Dependency Injection(依赖注入)和注释等功能。现在引入了一组全新的 API:Java Persistence API (JPA),以允许开发者管理 Java EE(甚至 SE)应用程序中的关系数据。另外,Sun 声称 Java Persistence API 表现了一些 Hibernate、TopLink(二者都会在稍后讨论)、JDO 以及 EJB 框架中最好的想法。

当前,GlassFish 项目提供了实施 JPA 的一个参考,JPA 在 GlassFish 应用程序服务器中作为 TopLink Essential 部分。您可以在 GlassFish 社区页 找到该 JPA 参考实施。不要混淆 TopLink Essentials 和 TopLink,前者现在是由 Oracle Corporation 拥有的关系映射工具。稍后我将在本文中讨论 TopLink 框架。

让我们来讨论一些您应该考虑应用 JPA 作为持久化框架的应用场景。

何时考虑将JPA作为持久化框架

您选择从流行的框架(比如 Hibernate、TopLink 和 EJB)中选择应用具有“好用”的功能且基于标准的框架。

您需要轻量级的持久化框架,且不需要 EJB 的容器提供的服务。

您需要可以在标准或 Enterprise Java 应用程序中使用的持久化框架。

何时考虑JPA的备选方案

您使用的 Java 的版本决定了实际是否可以应用 JPA。JPA 是 EJB 3.0 规范的一部分,而该规范是 Java EE 5 版本的一部分。如果您未更新到 Java EE 5,则无法使用 JPA。

您的应用程序需要 JPA 无法提供的服务,比如那些由 EJB 容器提供的服务,在那些情况下您更依赖 EJB。

在结束对此框架的讨论前,让我们列出一些使用 JPA 作为持久化框架的优势和缺点。

JPA有什么优势?

JPA 是基于标准的。越来越多的提供商期待在不久的将来提供 JPA 实施。

它提供了 Hibernate 和 TopLink 中最好的功能。

它可以和 Java SE 和 Java EE 应用程序一起使用,需要使用 EJB 容器,也可以不要。

JPA有什么缺点?

由于非常新,JPA 规范可能还需要进过重要发展才会变得很稳定。

JPA 是一个规范而不是一个产品。您需要提供商提供一个实施,才能获得这些基于标准的 API 的优势。

Hibernate

Hibernate 是一个对象持久化框架,简化了 Java 应用程序和底层关系数据库之间的对象关系映射。方法是提供 POJO 的透明持久化,作为“中介”层来提供自动持久化,并从 Java 应用程序加载对象到数据库表。借助 Hibernate,保存对象状态到数据库和从数据库加载对象状态与调用 Java 对象中的方法一样容易。您无需从您的应用程序代码中管理底层的数据操作;Hibernate 框架会为您完成所有的中间步骤。

让我们讨论一些您将会考虑应用 Hibernate 作为持久化框架的应用场景,以及那些您将寻求备选方案的应用场景。

何时使用Hibernate作为持久化框架

您正在寻求一个简单的持久化框架,该框架容易学习和使用。在您能够实际开始持久化您的 Java 对象到目标数据库之前,您只需要了解几个映射配置文件。

您正在寻求一个非常普通和灵活的持久化框架。Hibernate 的用法非常灵活:无论是否有应用程序服务器都可以使用,无论是否有关系数据库系统也可以使用。

您不想支付获取和维护费用。Hibernate 是开源而且免费的。

Hibernate 框架非常值得应用,因为它非常简单和灵活,同时也很强大。但是,在以下一些应用场景中您可能想要考虑应用其他框架。

何时考虑Hibernate的备选框架

您还不想要其他框架。尽管简单,Hibernate 框架仍然有自己的学习曲线、维护/更新周期,等等。

您需要容器提供的服务,比如那些由 EJB 提供的服务,在那些情况下您的选择局限于 EJB。

如果您正在使用或计划使用 Hibernate 作为您的持久化框架,这里是一些它的优势和缺点。

Hibernate有什么优势?

Hibernate 易于学习和使用。正如我在上面提到的,在您可以使用它之前,您只需要了解几个简单、自我描述的配置文件。

它 非常灵活。您可以在任何需要持久化服务的应用程序架构中使用 Hibernate。您可以通过 Servlet 和/或 Enterprise Java Bean 在 Standard Java 应用程序、Enterprise Java 应用程序中使用它。它也可以和 Spring 框架很好地集成。

它可以很好地向上扩展,因为它被设计为从底层一直到集群环境中工作。通过类似 Lazy Initialization 的技术以及通过 CGLIB 运行时间字节代码生成库优化 Java 反射,最新版的 Hibernate 的性能也得到了加强。

Hibernate有什么缺点?

Hibernate 是另一个拥有自己的应用和维护周期的框架。

尽管有积极的社区支持,但是有时候缺乏专注于此产品的提供商也使得宣传应用此框架显得没有说服力。

JPA与Hibernate的优缺点的更多相关文章

  1. JPA和hibernate的关系

    实际上,JPA的标准的定制是hibernate作者参与定制的,所以JPA是hibernate的一个总成,可以这么理解

  2. JPA与Hibernate的关系

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

  3. JPA和Hibernate的区别

    JPA Java Persistence API,是Java EE 5的标准ORM接口,也是ejb3规范的一部分. Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的 ...

  4. JPA入门例子(采用JPA的hibernate实现版本) 转

    JPA入门例子(采用JPA的hibernate实现版本) jpahibernate数据库jdbcjava框架(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化 ...

  5. java(样品集成框架spring、spring mvc、spring data jpa、hibernate)

    这是你自己的参考springside集成框架的开源项目.主要的整合spring.spring mvc.spring data jpa.hibernate几个框架,对于这些框架中仍然感觉更舒适sprin ...

  6. 谈论Hibernate级联删除——JPA根据Hibernate实现许多级联删除CascadeType.DELETE_ORPHAN

    声明: 1.这篇文章是原创.非复制或转载过来. 2.在本文中,参数都亲自做过实验证明. 3.这篇文章谈到了Hibernate配置基于注释的方法.hbm语法不可用. 不清JPA.Hibernate.EJ ...

  7. 使用JPA和Hibernate进行批量处理的最佳方式

    Tips 原文作者:Vlad Mihalcea 原文地址:The best way to do batch processing with JPA and Hibernate 在本文中,你将了解什么是 ...

  8. Jdbc、Mybatis、Hibernate各自优缺点及区别

    文章出处:Jdbc,Mybatis,Hibernate各自优缺点及区别 先比较下jdbc编程和hibernate编程各自的优缺点. 1.JDBC 我们平时使用jdbc进行编程,大致需要下面几个步骤:  ...

  9. SpringMVC+Apache Shiro+JPA(hibernate)整合配置

    序: 关于标题: 说是教学,实在愧不敢当,但苦与本人文笔有限,实在找不到更合理,谦逊的词语表达,只能先这样定义了. 其实最真实的想法,只是希望这个关键词能让更多的人浏览到这篇文章,也算是对于自己写文章 ...

随机推荐

  1. Unity中Instantiate物体失效问题

    才开始学Unity,开始总是这样用Instantiate函数: GameObject temp = (GameObject)Instantiate(bulletSource, transform.po ...

  2. C++-二维vector初始化大小方法-备忘

    来源: C++——二维vector初始化大小方法 1.直接用初始化方法 名字为vec,大小为n*m,初始值为0的二维vector. vector<vector<)); 2.用resize( ...

  3. UTC时间

    世界的每个地区都有自己的本地时间,在Internet及无线电通信时,时间的统一非常重要! 整个地球分为二十四时区,每个时区都有自己的本地时间.在国际无线电通信中,为统一而普遍使用一个标准时间,称为通用 ...

  4. 【NOIP2007】字符串展开解题报告

    描述 Description 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子串,我们就把它当作一种简写,输出时,用 ...

  5. Spfa+DP【p2149】[SDOI2009]Elaxia的路线

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia和w**每天都要奔波于宿舍和实验室之间 ...

  6. HDU1754I Hate It(线段树)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. UVA 699 The Falling Leaves (递归先序建立二叉树)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/19244 #include <iostream> #include <cstdio> # ...

  8. [BZOJ4817]树点涂色

    第一个操作比较麻烦,但可以看出它和lct里的access操作差不多,所以可以利用lct的性质巧妙维护操作1 直接用lct维护树中同颜色的链(因为染色操作是从$x$染到根所以同颜色的点一定形成一条链), ...

  9. [AGC012F]Prefix Median

    题目大意: 给定一个长度为$2n-1(n\le50)$的数组$a$,可以重排$a$中的元素,生成一个长度为$n$的数组$b$,其中$b_i$为$a_1\sim a_{2i-1}$的中位数.求对于给定的 ...

  10. js原生创建模拟事件和自定义事件的方法

    让我万万没想到的是,原来<JavaScript高级程序设计(第3版)>里面提到的方法已经是过时的了.后来我查看了MDN,才找到了最新的方法. 模拟鼠标事件MDN上已经说得很清楚,尽管为了保 ...