关于java:JPA和Hibernate有什么区别?

What's the difference between JPA and Hibernate?

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

我有使用iBATIS的经验,现在我正在尝试学习Hibernate或JPA2。我拿起了专业的JPA2书,它一直提到"JPA提供商"。例如:

If you think a feature should be standardized, you should speak up
and request it from your JPA provider

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

  • 仅使用jpa2,我可以通过简单地注释我的pojo从db获取数据吗?
  • jpa2是否应该与"jpa提供程序"一起使用,例如toplink或hibernate?如果是这样,那么与单独使用jpa2或单独使用hibernate相比,使用jpa2+hibernate有什么好处?
  • 你能推荐一本实用的JPA2书吗?pro jpa2"看起来更像是jpa2上的圣经和参考(直到本书的后半部分才进入查询)。有没有一本书采用了JPA2的问题/解决方法?


正如您所说,JPA只是一个规范,这意味着没有实现。您可以使用JPA注释尽可能多地注释类,但是如果没有实现,什么都不会发生。把JPA看作是必须遵循的准则或接口,而Hibernate的JPA实现是符合JPA规范定义的API并提供引擎盖下功能的代码。

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

有关更详细的描述,请阅读我的日志。


JPA是舞蹈,Hibernate是舞蹈演员。


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

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

Hibernate(2003年)提供了一种抽象SQL的方法,允许开发人员在持久对象(ORM)方面进行更多的思考。您通知Hibernate您的实体对象,它会自动生成策略来持久化它们。Hibernate提供了一个实现来实现这一点,API通过XML配置或注释来驱动实现。

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

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

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

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


JPA是接口,Hibernate是实现。

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

  • 冬眠
  • 托普林克
  • JDO

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

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

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

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

  • 扩展标识符生成器(hi/lo、pooled、pooled lo)
  • 透明的已准备语句批处理
  • 可定制CRUD(@SQLInsert@SQLUpdate@SQLDelete语句
  • 静态或动态收集过滤器(如@FilterDef@Filter@Where)和实体过滤器(如@Where)
  • 将属性映射到SQL片段(例如@Formula)
  • 不可变实体(如@Immutable)
  • 更多冲洗模式(如FlushMode.MANUALFlushMode.ALWAYS)
  • 通过给定实体的自然键查询二级缓存
  • 实体级缓存并发策略(如Cache(usage = CacheConcurrencyStrategy.READ_WRITE))
  • 通过HQL进行版本化批量更新
  • 排除乐观锁定检查中的字段(如@OptimisticLock(excluded = true))
  • 无版本乐观锁定(如OptimisticLockType.ALLOptimisticLockType.DIRTY)
  • 支持跳过(不等待)悲观锁请求
  • 支持Java 8的日期和时间
  • 支持多租户
  • 支持软删除(如@Where@Filter)

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


来自维基。

Motivation for creating the Java Persistence API

Many enterprise Java developers use lightweight persistent objects provided by open-source frameworks or Data Access Objects instead of entity beans: entity beans and enterprise beans had a reputation of being too heavyweight and complicated, and one could only use them in Java EE application servers. Many of the features of the third-party persistence frameworks were incorporated into the Java Persistence API, and as of 2006 projects like Hibernate (version 3.2) and Open-Source Version TopLink Essentials have become implementations of the Java Persistence API.

正如JCP页面中所述,Eclipse链接是JPA的参考实现。在这个问题上再多看看这个答案。

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

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


JPA只是一个需要具体实现的规范。Oracle现在提供的默认实现是"eclipseLink"。(Toplink由Oracle捐赠给Eclipse基金会与Eclipse)合并

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

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

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


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

Hibernate:只是一个JPA提供程序,它在JPA中实现了函数,并且可以有一些额外的函数,这些函数可能不在JPA中。

提示:您可以使用

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

Combo1:当您觉得Hibernate没有提供更好的性能,并且希望在不需要再次编写JPA的情况下更改JPA提供程序时使用。您可以编写另一个JPA提供程序…你可以改变很多次。

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

请访问http://blog-tothought.rhcloud.com//post/2,在那里您的完全困惑将得到澄清。


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


JPA是标准化ORMAPI的规范。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只是一个规范,在市场上有很多实现JPA的厂商。不同类型的供应商以不同的方式实现JPA。所以不同类型的供应商提供不同的功能,所以根据您的需求选择合适的供应商。

如果您使用的是Hibernate或任何其他供应商而不是JPA,那么您就不能轻易地移动到Hibernate以EclipseLink或OpenJPA以Hibernate。但是如果您使用的是JPA,那么您只需更改provide in persistence xml文件即可。因此,在JPA中很容易实现迁移。


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


JPA是Hibernate实现的API,Hibernate比JPA早。在JPA之前,您编写本机休眠代码来执行ORM。JPA只是接口,所以现在编写JPA代码,需要找到一个实现。Hibernate恰好是一个实现。

所以你的选择是:休眠、TopLink等…

JPA的优势在于它允许您在需要时交换实现。缺点是本地休眠/toplink/etc…API可能提供JPA规范不支持的功能。


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

因为它只是一个规范,所以需要一个工具来实现它。该工具可以是Hibernate、TopLink、iBatis、Spring数据等。

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

*(如果您还记得,当您在Hibernate中使用注释或映射(如@id、@column、@generatedvalue等)时,您会执行import javax.persistence.*;,这就是您在Hibernate下使用JPA的地方,您也可以使用JPA的@query&other功能)


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

因此,您应该能够在不同的应用服务器上部署应用程序。JPA在任何JavaEE兼容的应用服务器中实现,它允许交换应用服务器,但是实现也在改变。休眠应用程序可能更容易部署在不同的应用程序服务器上。


JPA是JSR,即Java规范要求,用于实现对象关系映射,它没有具体的代码来实现。它定义了一组规则,用于访问、持久化和管理Java对象和关系数据库之间的数据及其引入,EJB被JavaDeaveCube社区重量级批评。Hibernate是使用TE指南实现JPA的方法之一。Hibernate是一种高性能的对象/关系持久性和查询服务,它是在开源GNU较低的通用公共许可证(LGPL)下获得许可的。其好处是,您可以将Hibernate的JPA实现换成JPA的另一个实现。规范。使用直接休眠时,您将锁定到实现中,因为其他窗体可能使用不同的方法/配置和注释,因此您不能切换到其他窗体。


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

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


JPA只是一个需要具体实现的规范。Oracle提供的默认实现现在是"eclipseLink"。甲骨文将甲骨文捐赠给Eclipse基金会,以与之合并。

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

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

JPA与休眠


我尽量用非常简单的话来解释。

假设你需要一辆车,因为我们都知道他们是一些一流的制造商,如奔驰、宝马、奥迪等。

现在在上面的陈述中,汽车(是一种规格)因为每辆车都有一些共同的特征,比如四个轮子的东西,并且可以在道路上行驶的是汽车……所以它就像JPA。梅赛德斯、宝马、奥迪等仅根据客户群使用通用汽车功能并添加功能,因此他们正在实施Hibernate、iBatis等汽车规格。

所以,通过这些常见的特性,可以转到JPA,Hibernate只是根据JBoss需要实现的。

1件事

JPA包含一些基本属性,因此,如果将来要将Hibernate更改为任何其他实现,您可以轻松地进行切换,而无需太多麻烦,并且对于这些基本属性,包括可以用于任何实现技术的JPA注释、JPQL查询。

因此,我们主要使用JPA类型的技术实现Hibernate,以防我们希望根据客户机的需要切换我们的实现,另外,由于JPA中涉及到一些常见的特性,您将编写更少的代码。如果仍有人不清楚,那么您可以在堆栈溢出时评论我是新的。

谢谢你


JPA只是一个规范,而Hibernate是JPA提供者之一,即Hibernate正在实现JPA契约中提到的各种事情。


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


JPA是Java持久化API。它只指定API的规范。意味着用于创建API的规则和准则集。如果说是另一个上下文,它是一组标准,提供了创建这些API的包装器,可以用于从数据库访问实体对象。JPA是由Oracle提供的,当我们进行数据库访问时,肯定需要它的实现。意味着JPA只指定了实现API的准则。Hibernate是负责实现该API的JPA提供者/供应商。类似hibernate-toplink和open-jpa是JPA API提供程序的一些例子。所以我们通过Hibernate使用JPA指定的标准API。


简而言之,JPA只是接口、Hibernate/TopLink类(即接口实现)。

必须有接口实现才能使用接口。但是您可以通过接口使用类,即通过jpa api使用hibernate,或者直接使用实现,即直接使用hibernate,而不是通过纯jpa api。

JPA的一本好书是Vlad Mihalcea的"高性能Java持久化"。