【问题标题】:Why java.time.Instant is supported in Hibernate 5.2 but not in JPA 2?为什么 Hibernate 5.2 支持 java.time.Instant 而 JPA 2 不支持?
【发布时间】:2019-07-05 04:01:17
【问题描述】:

到目前为止,我了解到 JPA 是一种规范,而 Hibernate 是基于该规范的 ORM 工具,我们可以有不同的 JPA 实现。但是我不明白 JPA 2 怎么可能不支持 java.time.Instant 但 Hibernate 5.2x 支持它。

我已经阅读了这个问题why-jpa-does-not-support-java-time-instant,但它没有正确的答案,也没有谈到 hibernate 如何能够为 Instant 作为 JPA 特定实现提供支持。

【问题讨论】:

  • 另外,从历史上看,在 JPA 之前就有 Hibernate。 JPA 主要受到 Hibernate 的启发。
  • 仅供参考,在 Hibernate 支持之前,其他 JPA 提供程序(例如 DataNucleus)支持 Instant。为什么 JPA 规范(2.2)没有添加对它的支持归于 Oracle(又名 EclipseLink 团队)......只有他们没有“委员会”,请参阅这个问题以获得支持 github.com/eclipse-ee4j/jpa-api/issues/163
  • JPA 2 只是一个 API,因此它只说明必须支持的内容,而不是可以或不能支持的内容。因此,Hibernate 开发人员选择支持Instant,尽管没有明确要求他们这样做。我假设他们也正确支持强制类型。主要思想是:Hibernate 不仅限于做 JPA2 要求的事情,它们可以(并且显然)做更多的事情。其优点需要单独讨论。
  • ... 例如,考虑到 Hibernate 是 JPA 功能的超集,人们可能会谨慎行事,因为沉迷于特定于 Hibernate 的功能可能会被供应商锁定为无法将 JPA 提供商视为应用程序的外部服务(例如,如果您使用 Instants,则不能只插入任何合适的 JPA 提供程序,您会被锁定在支持该类型的服务中)。

标签: java database hibernate jpa jpa-2.0


【解决方案1】:

JPA 只是一个规范——它是一组提供通用 API 的接口。它描述了对关系数据库的访问,以帮助开发人员管理多个 dbms 供应商。 JPA 有多种实现,参考的是在 Eclipse Public License 下开发的 EclipseLink。换句话说,它是一个标准,如 SQL-92 或 SQL:2006。声称支持给定标准的数据库可以在它之外实现自己的功能,以使数据访问更容易。

为了使用 JPA,我们需要一个实现。除了 EclipseLink 之外,最常见的还有 Hibernate、OpenJPA 和 DataNucleus。它们都支持 JPA 2.2。

它们实现了 JPA 规范,但也提供了额外的功能来克服 JPA 的一些缺点。这些功能是实现之间的主要区别并使代码具体化,例如,使用 Hibernate 遵循在更改 JPA 规范时需要进行的代码更改。只有在使用 JPA 时,我们才能在实现之间切换。但是我从未见过任何改变 JPA 供应商的项目。

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2015-03-22
    • 2012-01-27
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多