JPA和Hibernate之间的区别是什么?

我知道JPA 2是一个规范,Hibernate是ORM的工具。另外,我知道Hibernate比JPA 2有更多的特性。但从实际的角度来看,两者到底有什么区别呢?

我有使用iBatis的经验,现在我正在尝试学习Hibernate或JPA2。我拿起Pro JPA2书,它一直提到“JPA提供商”。例如:

如果你认为一个特性应该标准化,你应该说出来 并从您的JPA提供者

请求它

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

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

正如您所说,JPA只是一个规范,这意味着没有实现。您可以尽可能多地使用JPA注释注释您的类,但是如果没有实现,什么也不会发生。将JPA视为必须遵循的指导方针或接口,而Hibernate的JPA实现是满足JPA规范定义的API并提供底层功能的代码。

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

要了解更详细的描述,请阅读我的博客条目

维基

创建Java Persistence API的动机

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

正如在JCP页面中所述,Eclipse链接是JPA的参考实现。请查看这个答案以获得更多关于这一点的信息。

JPA本身具有一些特性,这些特性将弥补标准ORM框架的不足。由于JPA是Java EE规范的一部分,您可以在项目中单独使用JPA,它应该与任何兼容Java EE的服务器一起工作。是的,这些服务器将拥有JPA规范的实现。

Hibernate是最流行的ORM框架,一旦JPA引入,Hibernate就符合JPA规范。除了它应该遵循的基本规范集之外,hibernate还提供了大量额外的东西。

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/

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 < a href = " http://www.eclipse.org/org/press-release/20080317_Eclipselink.php " > < / > ) < / p > 使用Eclipselink,可以确保代码在需要时可以移植到任何实现。 Hibernate也是一个完整的JPA实现+ MORE (JPA Plus的一种)。Hibernate是JPA的超级集,具有一些额外的Hibernate特定功能。 因此,在Hibernate中开发的应用程序在切换到其他实现时可能不兼容。 hibernate仍然是大多数开发人员作为JPA实现的选择,并被广泛使用

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

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

您可以将JPA看作是由Hibernate实现的一组规则。

JPA是舞蹈,Hibernate是舞者。

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

通常会有第三方开发包来执行官方JDK不包含的功能或填补空白。由于各种原因,该函数可能通过JCP (Java社区进程)成为Java JDK的一部分。

Hibernate(2003年)提供了一种抽象SQL的方法,并允许开发人员更多地从持久化对象(ORM)的角度进行思考。你通知hibernate关于你的Entity对象,它会自动生成持久化它们的策略。Hibernate提供了实现和API,通过XML配置或注释来驱动实现。

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

与此同时,JCP从Hibernate和其他ORM工具供应商那里获得了大量输入,正在开发JSR 220 (Java规范请求),这导致了JPA 1.0(2006年)和最终的JSR 317,即JPA 2.0(2009年)。这些是通用Java Persistence API的规范。该API在JDK中作为一组接口提供,因此您的类可以依赖于javax。持久性,而不用担心特定的供应商正在做持久化对象的工作。这只是API,而不是实现。Hibernate现在成为实现JPA 2.0规范的众多供应商之一。您可以针对JPA编写代码,并选择任何符合您需求的兼容ORM供应商。

在某些情况下,Hibernate可能会提供JPA中没有编码的特性。在这种情况下,您可以选择直接在类中插入Hibernate特定的注释,因为JPA没有提供接口来做这件事。

来源:# EYZ0

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

如果您正在使用Hibernate或任何其他供应商而不是JPA,那么您不能轻松地将Hibernate迁移到EclipseLink或OpenJPA迁移到Hibernate。但是如果您使用JPA,您只需要在持久性XML文件中更改提供。因此在JPA中很容易实现迁移。

Java——它不仅独立于操作系统,而且独立于供应商。

因此,应该是可以在不同的应用服务器上部署应用程序。 JPA是在任何Java EE兼容的应用服务器上实现的,它允许交换应用服务器,但是实现也会发生变化。一个Hibernate应用程序可能是更容易部署在不同的应用服务器上

JPA是接口,而Hibernate是实现。

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

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

从客户端角度来看,标准的持久性API非常方便,使得相对可以很容易地切换一个实现与另一个实现(尽管实际上并没有那么简单,因为在大型项目中,无论如何都必须使用特定的非标准特性)。

标准JPA将Java ORM的竞争推向了一个新的水平,这只会导致更好的实现。

正如在我的书《高性能Java持久性》Hibernate提供了JPA还不支持的特性中所解释的:

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

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

JPA:就像接口,没有具体的实现来使用JPA中的功能。

Hibernate:只是一个JPA提供者,它有JPA中功能的实现,并且可以有一些JPA中可能没有的额外功能。

提示:你可以使用

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

组合1:当您觉得您的hibernate没有提供更好的性能,并且希望在不必再次编写JPA时更改JPA Provider时使用。您可以编写另一个JPA Provider…并且可以随心所欲地改变。

组合2:很少使用,因为您不打算不惜任何代价更改JPA提供者。

访问http://blog-tothought.rhcloud.com//post/2,在那里你的困惑将被清除。

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

JPA是一个API,由Hibernate实现。Hibernate先于JPA。在JPA之前,您编写本地hibernate代码来执行ORM。JPA只是一个接口,所以现在编写JPA代码并需要找到一个实现。Hibernate恰好是一个实现。

所以你的选择是:

. Hibernate, toplink,等等

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

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

JPA只是一个规范,而Hibernate是JPA提供者之一,即Hibernate实现了JPA合同中提到的各种事情。

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

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

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

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

JPA vs Hibernate

JPA是Java Persistence API。仅指定api的规格。意味着用于创建api的一组规则和指导方针。如果说另一个上下文,它是一套标准,为创建这些api提供包装,可用于从数据库访问实体对象。JPA由oracle提供。当我们要进行数据库访问时,我们肯定需要它的实现。意味着JPA仅指定实现api的指导方针。Hibernate是一个JPA提供者/供应商,负责实现这些api。与Hibernate一样,TopLink和Open JPA也是一些JPA API提供者的例子。因此,我们通过hibernate使用JPA指定的标准api。

我尽量用简单的话解释。

假设你需要一辆车,我们都知道他们有几个a级制造商,如梅赛德斯,宝马,奥迪等。

现在在上面的声明中,CAR(是一种规格),因为每辆车都有共同的特征,比如有四个轮子的东西,可以在路上行驶的是汽车…所以它像JPA。 奔驰、宝马、奥迪等只是使用常见的汽车功能,并根据他们的客户基础添加功能,所以他们正在实现汽车规范,如hibernate、iBATIS等

因此,通过这个通用特性,jpa和hibernate只是一个实现,根据他们的jboss的需要。

还有一件事

JPA包括一些基本属性,所以在未来,如果你想改变hibernate到任何其他实现,你可以很容易地切换,而不需要太多的头痛,这些基本属性包括JPA注释,可以工作于任何实现技术,JPQL查询。

所以我们主要用JPA类型技术实现hibernate,只是为了以防万一我们想根据客户需要切换我们的实现,加上你会写更少的代码,因为JPA中涉及到一些常见的功能。 如果有人仍然不清楚,那么你可以评论为i m new on stack overflow

谢谢你!

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

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

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

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

因为它是只是一个说明,所以您需要一个工具来实现它。该工具可以是Hibernate、TopLink、iBatis、spring-data等。

如果您在数据层中使用Hibernate,则不一定需要JPA。但是,如果您为Hibernate使用JPA规范,那么它将使将来切换到其他ORM工具(如iBatis、TopLink)变得容易,因为该规范对其他工具也是通用的。

* (# EYZ1)