JPA和Hibernate有什么区别?[关闭]


680

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

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

如果您认为某个功能应该被标准化,则应该大声疾呼并向您的JPA提供者提出要求

这使我感到困惑,所以我有几个问题:

  • 我可以单独使用JPA2注释POJO即可从数据库中获取数据
  • JPA2是否应该与“ JPA Provider”一起使用,例如TopLink或Hibernate?如果是这样,那么与单独使用JPA2或单独使用Hibernate相比,使用JPA2 + Hibernate有什么好处?
  • 您能推荐一本实用的JPA2书籍吗?“ Pro JPA2”似乎更像是一本关于JPA2的圣经和参考书(直到本书的后半部分才进入Queries)。是否有一本书针对JPA2采用问题/解决方法?

2
关于“ JPA和Hibernate之间的区别”的问题是不正确的。Battle Hibernate对JPA毫无意义。为了避免实现不同的ORM,建议将JPA的任何实现与JPA API一起使用。
BERGUIGA Mohamed Amine 2014年

18
@ Berguiga.M.Amine,如果我们已经知道上述问题不正确。我们不需要再问了。我也对此话题感兴趣。
做Nhu Vy 2014年

我对春季“ org.springframework.orm.jpa.JpaTemplate”中使用的JpaTemplate感到困惑,它具有自己的函数,如persist(),find(),merge()等。那么事情如何在没有休眠的情况下工作?
nitin verma

@nitinverma:这确实是一个单独的问题。如果您仍然需要答案,建议您单独问自己的问题,以吸引更多反馈。
Wouter

Answers:


776

正如您所说的,JPA只是一个规范,意味着没有实现。您可以根据需要使用JPA批注对类进行批注,但是如果没有实现,将不会发生任何事情。将JPA视为必须遵循的指南或接口,而Hibernate的JPA实现是符合JPA规范定义的API并提供底层功能的代码。

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

有关更详细的描述,请阅读我的博客条目


5
因此,当您在JPA中使用Hibernate时,{java.persistence}批注将起作用,或者您将不得不使用{org.hibernate}批注?
Amruta 2014年

62
我只是想补充一点,用一个不同的ORM替换一个ORM是非常罕见的情况,因此您可能永远不会从使用JPA中获得这种好处。通过JPA获得的是协议,标准,命名和其他可用于与他人通信的约定。
pubsy 2014年

3
@pubsy我同意,但是原则上这是规范的卖点之一。
Kevin Bowersox 2014年

6
@Amruta回答您的问题,当将Hibernate与JPA一起使用时,{java.persistence}批注将起作用,而无需使用{org.hibernate}批注。
学习者2014年

3
只要一个人的代码仅使用JPA中提到的接口,就可以使用@JavaGeek。如果使用特定于休眠的功能,则必须使用org.hibernate注释。在此的更多内容
Suryavanshi

632

JPA是舞者,Hibernate是舞者。


189
JPA是艺术,Hibernate是艺术家。
2014年

10
我喜欢这种幽默感:) JPA是导演,Hibernate是演员。
user3278897 '16

7
但是,舞者(休眠)可以表演而无需跳舞(JPA):/
RevanthKrishnaKumar V.

3
这个答案没有任何解释,只是模糊的说法。
阿米尔·科斯特

11
这个隐喻不会增加理解。如果您已经知道区别,您将发现它令人困惑。如果您不知道区别,您仍然不会知道。
尼克·沃伦金

158

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

通常,有第三方开发的软件包可以执行某些功能或填补空白,而这并不是官方JDK的一部分。由于各种原因,该功能可能会通过JCP(Java社区流程)成为Java JDK的一部分。

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

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

同时,在Hibernate和其他ORM工具供应商的大力支持下,JCP正在开发JSR 220(Java规范请求),从而产生了JPA 1.0(2006年),最终产生了JSR 317,即JPA 2.0(2009年)。这些是通用Java Persistence API的规范。JDK以一组接口的形式提供了API,因此您的类可以依赖于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/


2
好的历史部分。而其他答案只是重复问题中的内容。
罗伯特

1
感谢那些启发性的精度。您说完成JPA是因为与Hibernate紧密结合的应用程序是抽象的需求,可以。但这不是一个无限的问题吗?现在应用程序不是紧紧地耦合到JPA吗?这里的真正好处是什么?我已经将Hibernate视为抽象层...
Aphax

4
@Aphax当然,当您编写.java文件时,您也与Java紧密相连,所以如果我明天想改用Python怎么办?
斯穆特杰

100

JPA是接口,而Hibernate是实现。

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

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

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

标准的JPA将Java ORM竞争推向了一个新的高度,这只会带来更好的实现。

正如上文我的书,高性能Java持久性那些尚未被JPA支持Hibernate提供的功能

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


这是一个好东西,我之前并不了解其他ORM工具
Avdhut

很好的答案,我非常喜欢这本书!感谢您发布它!
JonasJSchreiber


这〜JPA是接口,而Hibernate是实现
Eddie B

57

来自维基

创建Java Persistence API的动机

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

JCP页面所述,Eclipse链接是JPA的参考实现。对此有更多的了解。

JPA本身具有的功能将构成标准的ORM框架。由于JPA是Java EE规范的一部分,因此您可以在项目中单独使用JPA,并且它可以与任何与Java EE兼容的服务器一起使用。是的,这些服务器将具有JPA规范的实现。

一旦引入了JPA,Hibernate便是最流行的ORM框架,它符合JPA规范。除了应遵循的基本规范外,休眠还提供了很多其他内容。


3
也就是说,您可以在项目中单独使用JPA。您的意思是不使用Hibernate,TopLink或任何其他JPA实现吗?
阿巴斯(

2
@阿巴斯是的 Java EE规范仅使用JPA。如果添加休眠,它将提供一些附加功能。
ManuPK

1
我听说JPA只是一个接口/规范。如果我们在项目中单独使用JPA,那么它从哪儿实现呢?
阿巴斯2013年

@abbas感谢您的评论。我在答案中添加了更多详细信息。希望这可以帮助。
ManuPK

1
@Forhad始终需要一个实现,无论它是否埋在某些服务器体系结构中都没有关系,没有办法只是下载一些JPA库并让它为您执行持久性。
Kevin Bowersox 2014年

15

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开发的应用可能不兼容。休眠状态仍然是大多数开发人员的选择,因为JPA实现并被广泛使用。

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


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时,可以使用Combo 1:。您可以编写另一个JPA Provider ...,并且可以进行多次更改。

组合2:很少使用,因为当您不打算不惜一切代价更改JPA Provider时。

访问http://blog-tothought.rhcloud.com//post/2,在这里您会完全感到困惑。




5

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

如果您使用的是Hibernate或其他任何供应商而不是JPA,那么您就不容易将其休眠到EclipseLink或将OpenJPA转换为Hibernate。但是,如果您使用的是JPA,则只需要更改持久性XML文件即可。 JPA。


4

JPA是一种由Hibernate实现的API.Hibernate早于JPA。在使用JPA之前,您需要编写本地的休眠代码来执行ORM。JPA只是接口,因此现在您编写JPA代码,并且需要找到一个实现。Hibernate恰好是一个实现。

因此,您的选择是:休眠,顶部链接等。

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



3

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

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


3

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

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

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

*(如果您还记得的话,您import javax.persistence.*;在Hibernate中使用注解进行OR映射(例如@ Id,@ Column,@ GeneratedValue等)时会这么做,在Hibernate中使用JPA的地方,您可以将JPA的@Query和其他功能用作好


2

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

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


2

JPA是JSR,即实现对象关系映射的Java规范要求,它没有实现特定的代码。它定义了一组用于访问,持久化和管理Java对象与关系数据库之间的数据的规则。随着它的引入,EJB被替换,因为它被Java开发人员社区批评为重量级。Hibernate是可使用te准则实现JPA的方法之一.Hibernate是一种高性能的对象/关系持久性和查询服务,已根据开源GNU通用通用公共许可证(LGPL)许可使用。这样做的好处是您可以可以将Hibernate的JPA实现换成JPA规范的另一种实现。


1

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

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

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

JPA与Hibernate


1

我试图用很简单的话来解释。

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

现在,在上面的声明中,CAR(是一个规范)因为每辆汽车都有共同的特征,例如带有四个轮子的东西,并且可以在公路上行驶,所以汽车就像JPA。MERCEDES,BMW和AUDI等只是使用通用的汽车功能,并根据其客户群添加功能,因此他们正在实施诸如冬眠,iBATIS等汽车规范。

因此,通过此通用功能,jpa和hibernate只是根据其jboss需求而实现的。

还有1件事

JPA包含一些基本属性,因此将来如果您希望将休眠更改为任何其他实现,则可以轻松切换而不会感到头疼,并且对于那些基本属性,JPA批注可适用于任何实现技术,JPQL查询。

因此,主要是我们使用JPA类型技术来实现休眠状态,以防万一我们想根据客户需求切换实现方式,而且由于JPA包含一些常用功能,因此您将编写更少的代码。如果仍然不清楚,则可以在堆栈溢出时将其作为新消息进行评论。

谢谢


感谢您的建议
rajiv baghel

0

JPA只是一个规范,而Hibernate是JPA提供程序之一,也就是说,hibernate正在实现JPA合同中提到的各种功能。



-1

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


-2

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.