JPA和Hibernate有什么区别?

时间:2012-03-27 00:04:40

标签: java hibernate jpa java-ee orm

据我所知,JPA 2是规范,Hibernate是ORM的工具。另外,我知道Hibernate比JPA 2有更多的功能。但从实际的角度来看,真正的区别是什么?

我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2。我选了Pro JPA2书,它一直指的是“JPA提供者”。例如:

  

如果您认为某个功能应该标准化,那么您应该说出来   并从您的JPA提供商那里请求

这让我很困惑,所以我有几个问题:

  • 单独使用JPA2可以通过简单地注释我的POJO来从DB中获取数据
  • JPA2是否应该与“JPA Provider”一起使用,例如TopLink或Hibernate?如果是这样,那么使用JPA2 + Hibernate与单独使用JPA2相比有什么好处,或者与单独使用Hibernate相比有什么好处呢?
  • 你能推荐一本好的实用JPA2书。 “Pro JPA2”似乎更像是JPA2上的圣经和参考(直到本书的后半部分才进入查询)。是否有一本书对JPA2采取问题/解决方案?

22 个答案:

答案 0 :(得分:777)

正如您所说,JPA只是一个规范,意味着没有实现。您可以使用JPA注释尽可能多地注释您的类,但是如果没有实现,则不会发生任何事情。将JPA视为必须遵循的准则或接口,而Hibernate的JPA实现是满足JPA规范定义的API并提供引擎功能的代码。

当您使用Hibernate和JPA时,您实际上正在使用Hibernate JPA实现。这样做的好处是,您可以将Hibernate的JPA实现替换为JPA规范的另一个实现。当您使用直接Hibernate时,您将锁定到实现中,因为其他ORM可能使用不同的方法/配置和注释,因此您不能只切换到另一个ORM。

有关更详细的说明,请阅读我的blog entry

答案 1 :(得分:634)

JPA是舞蹈,Hibernate是舞者。

答案 2 :(得分:158)

如果没有JCP的语言和理解的历史视角,有些事情难以理解。

通常有第三方开发执行功能的软件包或填补不属于官方JDK的空白。由于各种原因,函数可能通过JCP(Java Community Process)成为Java JDK的一部分

Hibernate(2003年)提供了一种抽象SQL的方法,并允许开发人员在持久化对象(ORM)方面进行更多思考。您通知hibernate有关您的Entity对象的信息,它会自动生成保留它们的策略。 Hibernate提供了一个执行此操作的实现,以及通过XML配置或注释来驱动实现的API。

现在的根本问题是,您的代码与特定供应商(Hibernate)紧密耦合,因为很多人认为应该更通用。因此需要通用的持久性API。

同时,来自Hibernate和其他ORM工具供应商的大量输入的JCP正在开发JSR 220(Java规范请求),这导致JPA 1.0(2006)和最终JSR 317,即JPA 2.0(2009)。这些是通用Java Persistence API的规范。 API在JDK中作为一组接口提供,这样您的类可以依赖于javax.persistence,而不必担心正在执行持久化对象工作的特定供应商。这只是API,而不是实现。 Hibernate现在成为实现JPA 2.0规范的众多供应商之一。您可以编写JPA代码并选择符合您需求的合规ORM供应商。

有些情况下,Hibernate可能会为您提供未在JPA中编写的功能。在这种情况下,您可以选择直接在类中插入Hibernate特定注释,因为JPA不提供执行该操作的接口。

来源:http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/

答案 3 :(得分:100)

JPA是接口,而Hibernate是实现。

传统上有多种Java ORM解决方案:

每个实现定义自己的映射定义或客户端API。 JPA专家组收集了所有这些工具中的最佳工具,因此他们创建了Java Persistence API标准。

从客户的角度来看,标准持久性API非常方便,使得相对易于将一个实现与另一个实现切换(尽管在实践中它并不那么简单,因为在大型无论如何,您必须使用特定的非标准功能。

标准JPA将Java ORM竞争推向了一个新的水平,这只能带来更好的实施。

正如my book, High-Performance Java Persistence中所述,Hibernate offers features that are not yet supported by JPA

这些额外的功能允许Hibernate满足大型企业应用程序所需的许多持久性要求。

答案 4 :(得分:58)

来自Wiki

  

创建Java Persistence API的动机

     

许多企业Java开发人员使用开源框架或数据访问对象而不是实体bean提供的轻量级持久对象:实体bean和企业bean的声誉过于沉重和复杂,人们只能在Java EE中使用它们应用服务器。第三方持久性框架的许多功能已合并到Java Persistence API中,截至2006年,Hibernate(版本3.2)和开源版本TopLink Essentials等项目已成为Java Persistence API的实现。

正如JCP page中所述,Eclipse链接是JPA的参考实现。请仔细阅读this answer

JPA 本身具有弥补标准ORM框架的功能。由于JPA是Java EE规范的一部分,因此您可以在项目中单独使用JPA,它应该适用于任何Java EE compatible Servers。是的,这些服务器将具有JPA规范的实现。

Hibernate是最受欢迎的 ORM 框架,一旦引入 JPA ,hibernate符合 JPA 规范。除了它应遵循的基本规范之外,hibernate还提供了许多额外的东西。

答案 5 :(得分:16)

JPA只是一个需要具体实施的规范。 默认实现oracle 提供的是现在的“Eclipselink”。 (Toplink由Oracle捐赠给Eclipse基金会以与eclipselink合并)

(参考:http://www.oracle.com/technetwork/middleware/toplink/index-085257.html                http://www.eclipse.org/org/press-release/20080317_Eclipselink.php

使用Eclipselink,可以确保在需要时代码可移植到任何实现。 Hibernate也是一个完整的JPA实现+ MORE(排序JPA Plus)。 Hibernate是一套超级的JPA,具有一些额外的Hibernate特定功能。 因此,在切换到其他实现时,在Hibernate中开发的app可能不兼容。 仍然是hibernate是大多数开发人员的选择,作为JPA实现并被广泛使用。

另一个JPA实现是OpenJPA(openjpa.apache.org),它是Kodo实现的扩展。

答案 6 :(得分:15)

JPA:就像一个接口,没有具体实现它来使用JPA中的函数。

Hibernate:只是一个 JPA Provider ,它在JPA中具有函数的实现,并且可以具有JPA中可能不存在的一些额外函数。

提示:您可以使用

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

组合1 :当您认为您的休眠没有提供更好的性能并希望更改JPA Provider时,您不必再次编写JPA。您可以编写另一个JPA Provider ...并且可以多次更改。

Combo 2 :非常少用,因为您不会不惜一切代价更改JPA Provider。

访问http://blog-tothought.rhcloud.com//post/2,您的完全混淆将会明确。

答案 7 :(得分:11)

JPA是接口,Hibernate是该接口的一个实现。

答案 8 :(得分:10)

JPA是一种标准化ORM-API的规范。 Hibernate是JPA实现的供应商。因此,如果你将JPA与hibernate一起使用,你可以使用标准的JPA API,hibernate将在底层,提供更多非标准功能。 请参阅http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

答案 9 :(得分:5)

JPA只是一个规范。在市场上有许多供应商实施JPA。不同类型的供应商以不同的方式实现JPA。因此,不同类型的供应商提供不同的功能,因此请根据您的要求选择合适的供应商。

如果您使用的是Hibernate或任何其他供应商而不是JPA,那么您无法轻松地将Hibernate迁移到EclipseLink或OpenJPA到Hibernate.But如果您使用JPA而不是必须更改提供持久性XML文件。那么迁移是在JPA中很容易实现。

答案 10 :(得分:4)

JPA是一个API,Hibernate实现的.Hibernate早于JPA。在JPA之前,您编写本机hibernate代码来执行ORM。 JPA只是接口,所以现在你编写JPA代码,你需要找到一个实现。 Hibernate碰巧是一种实现。

所以你的选择是这样的: hibernate,toplink等...

JPA的优势在于它允许您在需要时替换您的实现。缺点是本机hibernate / toplink / etc ... API可能提供JPA规范不支持的功能。

答案 11 :(得分:4)

虽然JPA是规范,但Hibernate是遵循规范中规定的规则的实现提供者。

答案 12 :(得分:3)

Java - 它的独立性不仅来自操作系统,还来自供应商。

因此,您应该能够在不同的应用程序服务器上部署您的应用程序。 JPA在任何符合Java EE的应用程序服务器中实现,它允许交换应用程序服务器,但随后实现也在变化。 Hibernate应用程序可能更容易在不同的应用程序服务器上部署。

答案 13 :(得分:3)

JPA是您在数据层中实现的规范,用于执行数据库操作,OR映射和其他所需任务。

由于只是一个规范,您需要一个工具来实现它。该工具可以是Hibernate,TopLink,iBatis,spring-data等。

如果您在数据层中使用Hibernate,则不一定需要JPA。但是如果你对Hibernate使用JPA规范,那么将来很容易切换到其他ORM工具,比如iBatis,TopLink,因为规范对其他人来说也很常见。

*(如果你还记得,当你在Hibernate中使用注释进行OR映射(如@ Id,@ Column,@ GeneratedValue等)时,你会import javax.persistence.*;,那就是你所在的地方在Hibernate下使用JPA,您可以使用JPA的@Query&其他功能

答案 14 :(得分:2)

JPA是一个Java API规范,它描述了使用Java Platform管理应用程序中的关系数据。其中Hibernate是遵循JPA规范的ORM(对象关系映射)库。

您可以将JPA视为一组由Hibernate实现的规则。

答案 15 :(得分:2)

JPA是JSR,即Java规范要求,用于实现对象关系映射,该映射没有特定的实现代码。它为访问,持久化和管理Java对象与关系数据库之间的数据定义了一组规则。随着它的引入,EJB被取代,因为它被Java开发者社区批评为重量级。 Hibernate是使用te准则实现JPA的方式之一.Hibernate是一种高性能的对象/关系持久性和查询服务,它是在开源GNU宽通用公共许可证(LGPL)下获得许可的。这样做的好处就是你可以将Hibernate的JPA实现替换为JPA规范的另一个实现。当您使用直接Hibernate时,您将锁定到实现中,因为其他ORM可能使用不同的方法/配置和注释,因此您不能只切换到另一个ORM。

答案 16 :(得分:1)

JPA只是一个需要具体实施的规范。 oracle提供的默认实现是“Eclipselink”。 Toplink由Oracle捐赠给Eclipse基金会,与eclipselink合并。

使用Eclipselink,可以确保在需要时代码可移植到任何实现。 Hibernate也是一个完整的JPA实现+ MORE。 Hibernate是一套超级的JPA,具有一些额外的Hibernate特定功能。因此,在切换到其他实现时,在Hibernate中开发的应用程序可能不兼容。仍然是hibernate是大多数开发人员的选择,作为JPA实现并被广泛使用。

另一个JPA实现是OpenJPA,它是Kodo实现的扩展。

JPA vs Hibernate

答案 17 :(得分:1)

我试着用非常简单的词语解释。

假设您需要一辆汽车,因为我们都知道他们是几家A级制造商,如MERCEDES,BMW,AUDI等。

现在在上面的声明CAR(是一个规格),因为每辆车都有共同的功能,如4轮的东西,可以在道路上驾驶汽车...所以它像JPA。 而MERCEDES,宝马,奥迪等只是使用普通汽车功能并根据客户群添加功能,因此他们正在实施汽车规格,如hibernate,iBATIS等。

所以通过这个常见的功能去了jpa,而hibernate只是根据他们的jboss需要实现的。

还有1件事

JPA包含一些基本属性,因此将来如果你想将hibernate更改为任何其他实现,你可以轻松切换而不必担心这些基本属性包括JPA注释,它可以适用于任何实现技术,JPQL查询。

因此,我们主要使用JPA类型技术实现hibernate,以防我们根据客户需要切换实现,而且由于JPA中涉及一些常见功能,您将编写更少的代码。 如果有人仍然不清楚那么你可以评论,因为我是新的堆栈溢出。

谢谢

答案 18 :(得分:0)

JPA只是一个规范,而Hibernate是JPA提供者之一,即hibernate正在实现JPA合同中提到的各种内容。

答案 19 :(得分:0)

JPA或Java Persistence API是ORM实现的标准规范,而Hibernate是实际的ORM实现或框架。

答案 20 :(得分:-1)

JPA是Java Persistence API。其中仅指定API的规范。表示用于创建API的规则和指南集。如果说另一个上下文,它是一组标准,它提供了创建这些API的包装器,可用于从数据库访问实体对象。 JPA由oracle提供。当我们要进行数据库访问时,我们肯定需要它的实现。表示JPA仅指定实现API的准则。 Hibernate是负责实现API的JPA提供者/供应商。与Hibernate一样,TopLink和Open JPA是JPA API提供程序的一些示例。所以我们通过hibernate使用JPA指定的标准API。

答案 21 :(得分:-2)

形象地说,JPA只是接口,Hibernate / TopLink - 类(即接口实现)。

您必须具有接口实现才能使用接口。但是你可以通过接口使用class,即通过JPA API使用Hibernate,或者你可以直接使用实现,即直接使用Hibernate,而不是通过纯JPA API。

关于JPA的好书是Vlad Mihalcea的“高性能Java持久性”。