ChatGPT解决这个技术问题 Extra ChatGPT

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

关闭。这个问题是基于意见的。它目前不接受答案。 4年前关闭。锁定。这个问题及其答案被锁定,因为这个问题离题但具有历史意义。它目前不接受新的答案或交互。

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

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

如果您认为某个功能应该标准化,您应该大声说出来并向您的 JPA 提供商提出要求

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

单独使用 JPA2 可以通过简单地注释我的 POJO 来从数据库中获取数据

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:这确实是一个单独的问题。如果您仍然需要答案,我建议您单独提出自己的问题以吸引更多反馈。

K
Kevin Bowersox

正如您所说,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 回答您的问题,当使用 Hibernate 和 JPA 时,{java.persistence} 注释将起作用,无需使用 {org.hibernate} 注释。
@JavaGeek 这是真的,只要一个人的代码只使用 JPA 中提到的接口。如果使用特定于休眠的功能,那么他们必须使用 org.hibernate 注释。 more on this
j
johnm

JPA 是舞者,Hibernate 是舞者。


嘿,但是有人可以使用 javax.persistence.entityManager 而不是 org.hibernate.session
但是,Dancer(Hibernate)可以在没有舞蹈(JPA)的情况下表演,不是吗:/
这个答案没有解释什么,只是一个模糊的说法。
这个比喻没有增加理解。如果您已经知道其中的区别,您会发现它很有趣。如果你不知道区别,你仍然不会知道它。
@NickVolynkin 公平地说,这就是为什么它不是公认的答案。话虽如此,我认为在阅读了接受的答案然后阅读了这个答案之后,很清楚两者之间的区别是什么。
J
Jordi Castilla

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

通常有第三方开发的包执行某种功能或填补官方 JDK 之外的空白。由于各种原因,该功能可能会通过 JCP(Java 社区进程)成为 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 怎么办?
V
Vlad Mihalcea

JPA 是接口,而 Hibernate 是实现。

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

休眠

顶联

JDO

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

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

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

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

扩展标识符生成器(hi/lo、pooled、pooled-lo)

透明的准备好的语句批处理

可定制的 CRUD(@SQLInsert、@SQLUpdate、@SQLDelete)语句

静态或动态集合过滤器(例如@FilterDef、@Filter、@Where)和实体过滤器(例如@Where)

将属性映射到 SQL 片段(例如 @Formula)

不可变实体(例如@Immutable)

更多刷新模式(例如 FlushMode.MANUAL、FlushMode.ALWAYS)

通过给定实体的自然键查询二级缓存

实体级缓存并发策略(例如 Cache(usage = CacheConcurrencyStrategy.READ_WRITE))

通过 HQL 进行版本化批量更新

从乐观锁定检查中排除字段(例如 @OptimisticLock(excluded = true))

无版本乐观锁定(例如 OptimisticLockType.ALL、OptimisticLockType.DIRTY)

支持跳过(无需等待)悲观锁请求

支持 Java 8 日期和时间

支持多租户

支持软删除(例如@Where、@Filter)

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


这个不错,之前不知道其他的ORM工具
很好的答案,我非常喜欢这本书!感谢您发布它!
感谢您喜欢我的 High-Performance Java Persistence 本书。
这〜JPA是接口,而Hibernate是实现
C
Community

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库并让它为您执行持久性。
s
supernova

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


v
vkrishna17

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,您的困惑将一扫而光。


T
Thiago Burgos

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


在此之上,Hibernate 添加了更多功能/方法。
k
kandarp

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/


s
sus007

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

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


V
Vanishree Gv

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

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

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


j
javierZanetti

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


A
Arjan Tijms

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

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


A
Arun Raaj

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 以及其他功能


B
Badal

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

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


c
codechefvaibhavkashyap

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


佚名

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

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

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

JPA vs Hibernate


C
Community

我试着用非常简单的话来解释。

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

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

所以通过这个共同的特性去jpa和hibernate只是根据他们的jboss需要的一个实现。

还有 1 件事

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

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

谢谢


感谢您的建议
K
Kumar-Sandeep

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


A
Amit Gujarathi

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


M
Mr.DevEng

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


A
Anton Tupy

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

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

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