orm与jpa_Hibernate与JPA:这些数据库ORM API之间有什么区别?

在最近对TheServerSide的JDBC定义进行更新的过程中,我研究了与数据库API相关的常见查询术语,并惊讶于仍然有人对JPA和Hibernate之间的差异感到困惑。

根据我的研究,术语“ 什么是JDBC? 每月被查询2900次。 “ Hibernate vs. JPA”一词被查询了3,600次。 因此,这两个非常不同但又相关的主题之间显然存在很多混乱。

我借此机会希望一劳永逸地阐明Java Persistence API与Hibernate之间的异同。

JPA和Hibernate有什么区别?

JPA和Hibernate之间的主要区别在于JPA是一个规范。 Hibernate是Red Hat对JPA规范的实现。

只有一个JPA规范。 JPA规范是通过Java社区流程(JCP)协作开发的,并且更新是作为Java规范请求(JSR)发布的。 如果社区同意JSR内提出的所有更改,那么将发布API的新版本。

当2009年发布JPA 2.0,JSR#317时, 投票赞成该规范的 JCP委员会成员包括Oracle,IBM,Red Hat,VMWare和Sun Microsystems。 如您所见,软件行业中的许多知名人士都参与了API的发展。

orm与jpa_Hibernate与JPA:这些数据库ORM API之间有什么区别?

Java Persistence API的最终投票批准。

规范和实现之间的区别

只有一个JPA规范。 但是,有许多不同的实现。

各种项目,包括DataNucleus,TopLink,EclipseLink,OpenJPA和Hibernate,都提供了JPA规范的实现。 这些项目及其背后的供应商通过尝试提供更快,更有效,更易于部署,与更多外部系统集成并且可能比其他许可证具有更少限制性许可证的实施来竞争。 Hibernate只是JPA规范的许多实现之一,尽管Java开发人员往往对此最熟悉。

JPA或Hibernate问题

事实是,JPA与Hibernate问题不是一个好问题,因为这两个概念之间确实没有任何交叉之处。 您不能真正在性能,可伸缩性或可靠性方面比较JPA和Hibernate,因为两者在这些方面并没有真正的竞争。 JPA是规格。 Hibernate是一个实现。

无需任何组织 Hibernate和JPA 之间进行选择 组织要么选择使用JPA,要么不选择使用。 而且,如果组织确实选择使用Java Persistence API与关系数据库系统进行交互,则他们可以在各种实现之间进行选择,并且最受欢迎的实现之一就是JBoss Hibernate项目。

为什么所有的Hibernate与JPA混淆?

鉴于JPA和Hibernate承担着两个非常不同的角色,因此提出了一个问题,即为什么在这两个术语上会有如此多的困惑。 据我所知,这种混淆可以追溯到最初发布JPA规范的时间。

在2006年首次发布JPA 1.0之前,有许多供应商在对象关系映射( ORM )工具领域竞争,所有这些供应商都有非常相似的API,可以实现许多相同的目标。 但是,这些项目都没有兼容和可互换的代码。 JPA的目标是标准化Java应用程序执行ORM的方式。 在JPA 1.0中,所有竞争的实现都是统一的,因为它们现在都实现了通用的标准API。

但是,由于Hibernate的流行,许多人在真正表示JPA时继续使用Hibernate这个词。 Hibernate成为JPA的名字命名,就像是舒洁 浴室组织的名字命名。 即使在今天,当开发人员和架构师谈论Hibernate时 ,他们实际上只是在参考JPA规范。

orm与jpa_Hibernate与JPA:这些数据库ORM API之间有什么区别?

用JPA注释修饰的JavaBean。

在JPA和Hibernate之间进行选择

前面我提到过,不必在JPA和Hibernate之间进行选择,因为Hibernate提供的所有功能都可以通过JPA API轻松访问。 但是,情况并非总是如此。 在JPA发行的初期,实际上确实有一段时间,在JPA和Hibernate之间进行选择是组织必须做出的合理决定。

JPA最初的发布是非常基本的,并且当时没有包括Hibernate中提供的许多高级功能,包括Hibernate的功能非常强大的Criteria API。 首次发布JPA时,许多组织都同时使用JPA和Hibernate。 开发人员将在其代码中调用专有的Hibernate API,例如HibernateSession ,同时,他们将使用基于JPA的注释来修饰JavaBean和POJO,以简化Java代码与使用中的关系数据库之间的映射。 通过这样做,组织可以利用标准API中有用的功能,并同时可以访问各种尚未标准化的Hibernate功能。

Hibernate与JPA的优势

即使在今天,也有可能将高级映射功能嵌入到Hibernate框架中,而JPA规范尚未提供这些功能。 由于JPA受JCP和JSR流程的指导,因此添加新功能通常是一个缓慢而系统的过程。 但是,由于管理Hibernate项目的JBoss团队不受这些限制的约束,因此他们可以通过其专有的API更快地使用功能。 Hibernate早在JPA规范赶上之前就实现了一些重要功能,包括:

  • Java 8日期和时间支持
  • SQL片段映射
  • 不可变实体类型
  • 实体过滤器
  • SQL片段匹配
  • 手动冲洗模式
  • 二级缓存查询
  • 软删除

但是,尽管事实上Hibernate在引入新功能和高级功能时通常比较快,但JPA 2.0版本几乎弥补了两者之间的差距。 当JPA规范几乎总是提供等效功能时,对于任何软件开发人员来说,使用专有API来开发应用程序都将是困难的。

而且,如果需要这些高级Hibernate功能之一,则始终可以编写绕过JPA并直接调用Hibernate代码的代码 ,从而完全消除了在JPA和Hibernate辩论中选择一方的需要。

翻译自: https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/Set-the-record-straight-on-the-JPA-and-Hibernate-debate