JPA和Hibernate有什么区别?

Ant*_*ony 681 java orm hibernate jpa java-ee

我知道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采取问题/解决方案?

Kev*_*sox 776

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

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

有关更详细的说明,请阅读我的博客文章.

  • 我只是想补充说,用一个不同的ORM替换一个ORM是一个非常罕见的场合,所以你可能永远不会从使用JPA中获得这个好处.您通过JPA获得的是协议,标准,命名和其他可用于与他人通信的约定. (62认同)
  • @Amruta回答你的问题,当一个人使用Hibernate和JPA时,{java.persistence}注释将起作用,不需要使用{org.hibernate}注释. (6认同)
  • 那么,当您使用Hibernate和JPA时,{java.persistence}注释将起作用,或者您将不得不使用{org.hibernate}注释? (5认同)
  • @pubsy我同意,但原则上这是规范的卖点之一. (3认同)
  • @JavaGeek只要一个代码只使用JPA中提到的接口就是真的.如果使用特定于休眠的特性,那么他们必须使用`org.hibernate`注释.[更多内容](http://stackoverflow.com/questions/16052347/hibernate-or-jpa-annotations-to-use) (3认同)

joh*_*hnm 633

JPA是舞蹈,Hibernate是舞者.

  • JPA是艺术,Hibernate是艺术家. (189认同)
  • 这个比喻并没有增加理解.如果你已经知道差异,你会发现它很有意思.如果你不知道差异,你仍然不会知道. (11认同)
  • 我喜欢这种幽默感:) JPA是导演,Hibernate是演员. (10认同)
  • 但是,Dancer(Hibernate)可以在没有舞蹈的情况下表演(JPA)不是吗:/ (7认同)
  • 这个答案没有解释任何事情,只是一个含糊的说法. (3认同)
  • @NickVolynkin公平地说,这就是为什么它不是公认的答案.话虽如此,我认为在阅读了接受的答案然后阅读这个答案之后,很明显两者之间的区别是什么. (3认同)
  • 嘿,但有人可以使用javax.persistence.entityManager而不是org.hibernate.session (2认同)
  • @Sangdol,这[维基百科](https://en.wikipedia.org/wiki/Java_Persistence_API#JPA_2.1)页面应该会有所帮助. (2认同)
  • JPA是汽车,Hibernate是驱动程序. (2认同)
  • 国际象棋是国际象棋,Hibernate是国际象棋棋手 (2认同)

Ken*_*ock 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/

  • @Aphax当然,当您编写.java文件时,您也与Java紧密耦合,那么如果我想明天切换到Python呢? (4认同)
  • 好的历史部分.而其他答案只是重复问题中的内容. (2认同)

Vla*_*cea 100

JPA是接口,而Hibernate是实现.

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

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

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

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

正如我的书"高性能Java持久性"中所解释的,Hibernate提供了JPA尚不支持的功能:

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


Man*_*uPK 57

来自Wiki.

创建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规范的实现.

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

  • _那说你可以在一个项目中单独使用JPA.????你的意思是不使用Hibernate,TopLink或任何其他JPA实现? (3认同)
  • @abbas是的.Java EE规范仅使用JPA.如果你添加休眠,它会提供一些额外的功能. (2认同)

sup*_*ova 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中开发的应用程序可能不兼容.仍然hibernate是大多数开发人员的选择,作为JPA实现并被广泛使用.

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


vkr*_*a17 15

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

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

提示:你可以使用

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 
Run Code Online (Sandbox Code Playgroud)

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

组合2:使用非常少,因为您不会不惜一切代价更改JPA Provider.

访问http://blog-tothought.rhcloud.com//post/2,您的完全混淆将变得清晰.


Thi*_*gos 11

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

  • 最重要的是,Hibernate增加了一些功能/方法. (2认同)

kan*_*arp 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/


小智 5

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

如果你使用的是Hibernate或任何其他供应商而不是JPA,那么你就不能轻易地将hibernate转移到EclipseLink或OpenJPA到Hibernate.But如果你使用JPA而不是只需要在持久性XML文件中更改提供.那么迁移很容易在JPA.