【问题标题】:What are the differences between Hibernate and JPA?Hibernate 和 JPA 有什么区别?
【发布时间】:2011-08-06 10:31:51
【问题描述】:

当我在大学学习网络编程时,他们向我们介绍了休眠。

我们使用了一段时间,我什至有机会在公司的真实场景中使用它将近 8 个月。 现在我完全切换到 Java EE 6(我恋爱了 :)),我使用 JPA 来满足我的 ORM 需求。

我使用它已经有几个月了,但我真的不明白一个和另一个之间有什么区别。为什么有些人说一个或另一个更好或更坏? 我在两者中进行映射和注释的方式几乎相同......

也许你能解决我的一些疑惑:

-各有什么优缺点?

-Hibernate 是使用 JPA 还是其他方式(它们是否相互依赖)?

-从特征的角度来看,一个有哪些特征没有另一个?

-两者之间还有其他区别吗?

【问题讨论】:

标签: java hibernate jpa jakarta-ee jpa-2.0


【解决方案1】:

JPA(Java Persistence API)是一个 API,JPA 2.0 属于 JSR 317 组。基本上它是一个通过使用 ORM(对象关系映射)进行数据持久性来管理关系数据的框架。

Hibernate 是一个 ORM 库,可将您的 POJO/JavaBeans 映射到您的数据持久性。 ORM 和 JPA 都有用于将 POJO 映射到 DB 表的对象/关系元数据(XML、注释)。

Hibernate 是使用 JPA 还是其他 周围的方式(他们是否取决于每个 其他)?

Hibernate 3 现在支持 JPA 2.0。 JPA 是使用对象模型描述关系数据的关系和管理的规范。由于 JPA 是一个 API,Hibernate 实现了这个 API。您所要做的就是使用 JPA API 类/接口编写程序,将 Hibernate 配置为 JPA 资源,瞧,您就可以运行 JPA。

有什么优点和 各有优缺点?

优点:

  • 避免使用低级 JDBC 和 SQL 代码。
  • 它是免费的(EclipseLink 例如用于 JPA)。
  • JPA 是标准,是 EJB3 和 Java EE 的一部分。

这就是我对 Hibernate 的了解。

【讨论】:

  • 如果 Java EE 5 只支持 JPA 1.0,我可以在 Java EE 5 环境中使用最新版本的 HIbernate (4.1.x) 吗?
  • 这个答案并不清楚,如果没有一个甚至可以是 Hibernate 的实现,JPA 就无法工作。
【解决方案2】:

Hibernate 是新现代 JPA 的灵感来源。 EJB 3.0 ORM (JPA) 基于简单、干净、美观的 Hibernate。

JPA 诞生时,Hibernate 成为了 JBoss 的 JPA 实现基础。所以如果你使用的是 JBoss 和 JPA,你很可能在下面使用 Hibernate。

我看不出其中一个比另一个有任何显着优势。也许主要的是,如果您使用 JPA,那么您使用的是纯 JavaEE 实现。这意味着,理论上,您可以切换到不同的应用程序服务器,即使新的应用程序服务器没有使用 Hibernate,您的应用程序仍然可以工作。请记住,我说的是 IN THEORY。 :-)

JPA 在某些应用服务器中使用 Hibernate。 RedHat 的 JBoss 是使用 Hibernate 实现 JPA 的主要产品。

【讨论】:

  • 关于当你提到“JPA在一些应用服务器中使用Hibernate”的时候我很好奇,GlassfishV3.0是否使用了Hibernate?我使用 Glassfish,我想有时我在控制台上看到一些与休眠相关的消息,在构建或做一些映射时。
  • @sfrj 我不认为 Glassfish 使用 Hibernate。我认为它使用了一个名为 TopLink(属于 Oracle)的库。
  • 我可能弄错了,我以为我在控制台中看到过几次休眠这个词 :)
  • 让我们明确一点;任何应用服务器都可以任何 JPA 实现。它可能与 JEE 供应商开发的捆绑在一起,但这并不一定意味着最适合该应用程序,您可以使用您选择的实现。
【解决方案3】:

JPA 是一种用于持久性映射的 API 标准。它是在 Hibernate 之后很久才开发的,并深受其影响。

要使用 JPA,您需要一个 JPA 实现。 Hibernate 就是这样一种 JPA 实现,因为它被扩展以实现它所启发的 API。

此外,Hibernate 提供了一些 JPA 标准没有提供的功能,但这些功能通常是不需要的。

另一方面,如果您只使用 JPA 功能,您的代码也应该使用不同的 JPA 实现——经验表明兼容性很少是 100%,但切换到不同的实现不需要很多工作。

【讨论】:

    【解决方案4】:

    JPA 是一个标准,由许多不同的库实现,例如 TopLink。 Hibernate 是一个早于 JPA 就存在的库,并且具有 JPA 所没有的一些特性。

    Criteria api 两者都有,但我认为 Hibernate 的使用要简单得多。 因此,如果您使用 JPA,则可以毫无问题地切换到不同的实现,或者您可能有一个定义基本 JPA dao 的基础项目和两个使用不同实现的不同项目。

    如果您使用 Hibernate,可能更容易找到示例和专家。

    【讨论】:

      【解决方案5】:
      interface JPA {
          void merge(Object o);
      }
      
      class Hibernate implements JPA {
          @Override
          public void merge(Object o) {
              // Implementation here
          }
      }
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      【解决方案6】:

      我会尽量解释清楚。

      -各有什么优缺点?

      JPA 属性是可移植的。以 javax.persistence 开头的库与 JPA 相关联。像 hibernate 这样的提供者提供了不可移植的属性。因此,最佳实践是尽可能使用 javax.persistence。

      -Hibernate 是使用 JPA 还是其他方式(它们是否相互依赖)?

      JPA 是对 JDBC 的抽象。 JPA 是一个规范。它需要提供者。 Hibernate 是众多提供者之一。

      -从特征的角度来看,一个有哪些特征没有另一个?

      Hibernate = ORM + JPA 的实现 因此,您会在 Hibernate 中发现一些额外的功能。

      -两者之间还有其他区别吗?

      Hibernate 在过去几年中发生了很大变化。我发现 JPA 是一致的。因此,如果不需要,请尽可能尝试使用 javax.persistence 库。

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        • 2013-06-30
        • 2011-07-18
        相关资源
        最近更新 更多