【问题标题】:What's the difference between JPA and Hibernate? [closed]JPA 和 Hibernate 有什么区别? [关闭]
【发布时间】:2012-04-10 12:23:44
【问题描述】:

我了解 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 的问题/解决方法?

【问题讨论】:

  • 关于“JPA 和 Hibernate 的区别”的问题不正确。 Battle Hibernate vs JPA 毫无意义。建议将 JPA 的任何实现与 JPA API 一起使用,以避免实现不同的 ORM。
  • @Berguiga.M.Amine ,如果我们已经知道上述问题是不正确的。我们不需要再问了。我也对这个话题感兴趣。
  • 我对 spring “org.springframework.orm.jpa.JpaTemplate” 中使用的 JpaTemplate 感到困惑,它有自己的函数,如 persist()、find()、merge() 等。那么如何没有休眠也能正常工作?
  • @nitinverma :这确实是一个单独的问题。如果您仍然需要答案,我建议您单独提出自己的问题以吸引更多反馈。

标签: java hibernate jpa jakarta-ee orm


【解决方案1】:

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

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

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

*(如果你记得,当你在 Hibernate 中使用 OR 映射注解(如@Id、@Column、@GeneratedValue 等)时,你会使用 import javax.persistence.*;,这就是你在 Hibernate 下使用 JPA 的地方,你也可以使用 JPA 的 @Query 和其他功能

【讨论】:

    【解决方案2】:

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

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

    关于 JPA 的好书是 Vlad Mihalcea 的“High-Performance Java Persistence”。

    【讨论】:

      【解决方案3】:

      JPA 是接口,而 Hibernate 是实现。

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

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

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

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

      my book, High-Performance Java PersistenceHibernate offers features that are not yet supported by JPA 中所述:

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

      【讨论】:

      • 这个不错,之前不知道其他的ORM工具
      • 很好的答案,我非常喜欢这本书!感谢发布!
      • 感谢您阅读我的High-Performance Java Persistence 书。
      • 这个~JPA是接口,Hibernate是实现
      【解决方案4】:

      我尽量用简单的语言来解释。

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

      现在在上面的声明中,CAR(是一个规范),因为每辆车都有共同的特征,比如有 4 个轮子的东西,并且可以在路上行驶……所以它就像 JPA。 而 MERCEDES、BMW、AUDI 等只是使用常见的汽车功能并根据他们的客户群添加功能,因此他们正在实施 hibernate、iBATIS 等汽车规范。

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

      还有一件事

      JPA 包含一些基本属性,因此将来如果您想将 hibernate 更改为任何其他实现,您可以轻松切换而不会感到头疼,并且这些基本属性包括 JPA 注释,可用于任何实现技术,JPQL 查询。

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

      谢谢

      【讨论】:

      • 感谢您的建议
      【解决方案5】:

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

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

      如需更详细的描述,请阅读我的blog entry

      【讨论】:

      • 那么,当您将 Hibernate 与 JPA 一起使用时,{java.persistence} 注释将起作用,还是您必须使用 {org.hibernate} 注释?
      • 我只是想补充一点,用不同的 ORM 替换一个 ORM 是非常罕见的情况,因此您可能永远不会从使用 JPA 中获得这种好处。您使用 JPA 获得的是可用于与他人通信的协议、标准、命名和其他约定。
      • @pubsy 我同意,但原则上这是规范的卖点之一。
      • @Amruta 回答您的问题,当使用 JPA 的 Hibernate 时,{java.persistence} 注释将起作用,无需使用 {org.hibernate} 注释。
      • @JavaGeek 只要一个人的代码只使用 JPA 中提到的接口,那就是真的。如果使用特定于休眠的功能,那么他们必须使用org.hibernate 注释。 more on this
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

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

        JPA vs Hibernate

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

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

                所以你的选择是这样的: 休眠、toplink 等...

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

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    【解决方案13】:

                    如果没有语言的历史视角和对 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/

                    【讨论】:

                    • 很好的历史部分。而其他答案只是重复问题中的内容。
                    • 感谢那些启发性的精确度。你说 JPA 完成是因为应用程序与 Hibernate 紧密耦合,它需要抽象,好的。但这不是一个无限的问题吗?应用程序现在不是与 JPA 紧密耦合吗?这里的真正好处是什么?我已经将 Hibernate 视为一个抽象层...
                    • @Aphax 当然,当您编写 .java 文件时,您也与 Java 紧密耦合,那么如果我明天想切换到 Python 怎么办?
                    【解决方案14】:

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

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

                    提示:您可以使用

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

                    Combo 1 : 当你觉得你的 hibernate 没有提供更好的性能并且想要更改 JPA Provider 时使用,你不必再次编写你的 JPA。您可以编写另一个 JPA Provider ... 并且可以多次更改。

                    Combo 2 :当你不打算不惜一切代价改变你的 JPA 提供者时,它的使用非常少。

                    访问http://blog-tothought.rhcloud.com//post/2,您的困惑将一扫而光。

                    【讨论】:

                      【解决方案15】:

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

                      【讨论】:

                      • 除此之外,Hibernate 添加了更多功能/方法。
                      【解决方案16】:

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

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

                      【讨论】:

                        【解决方案17】:

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

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

                        【讨论】:

                          【解决方案18】:

                          JPA 是舞者,Hibernate 是舞者。

                          【讨论】:

                          • JPA 是艺术,Hibernate 是艺术家。
                          • 我喜欢这种幽默感 :) JPA 是导演,Hibernate 是演员。
                          • 但是,Dancer(Hibernate)可以在没有舞蹈(JPA)的情况下表演,不是吗:/
                          • 这个答案没有解释什么,只是一个模糊的说法。
                          • 这个比喻没有增加理解。如果您已经知道其中的区别,您会发现它很有趣。如果你不知道区别,你仍然不会知道。
                          【解决方案19】:

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

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

                          【讨论】:

                            【解决方案20】:

                            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 实现的扩展。

                            【讨论】:

                              【解决方案21】:

                              来自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 的基本规范集之外,它还提供了很多额外的东西。

                              【讨论】:

                              • 也就是说你可以在项目中单独使用 JPA。?? 你的意思是不使用 Hibernate、TopLink 或任何其他 JPA 实现?
                              • @abbas 是的。 Java EE 规范仅使用 JPA。如果你添加休眠,它会提供一些额外的功能。
                              • 我听说 JPA 只是一个接口/规范。如果我们在项目中单独使用 JPA,那么它的实现从何而来?
                              • @abbas 感谢您的评论。我在答案中添加了更多细节。希望这会有所帮助。
                              • @Forhad 总是需要一个实现,不管它是否埋在某些服务器架构中,都没有办法只下载一些 JPA 库并让它为您执行持久性。
                              【解决方案22】:

                              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/

                              【讨论】:

                                猜你喜欢
                                • 2011-08-06
                                • 1970-01-01
                                • 1970-01-01
                                • 2011-07-18
                                • 1970-01-01
                                • 2011-05-29
                                相关资源
                                最近更新 更多