什么是 JPA 提供者? [关闭]

Posted

技术标签:

【中文标题】什么是 JPA 提供者? [关闭]【英文标题】:What is a JPA Provider? [closed] 【发布时间】:2015-02-09 19:10:24 【问题描述】:

我是 JPA 的新手。据我了解,JPA 本身不能持久化。它将需要 JPA Provider 来将数据持久化到数据库中。

JPA Provider :它是包含 JPA 风格 (javax.persistence) 的供应商产品。例如 Eclipselink、Toplink、Hibernate 等。 http://www.tutorialspoint.com/jpa/jpa_orm_components.htm

因此,任何想要使用 JPA 进行持久性的应用程序都必须使用 Provider,例如 Eclipselink、Toplink、Hibernate 等。这是正确的吗?

【问题讨论】:

您有问题吗? 问题在标题中。什么是“JPA 提供者”?没什么,因为正确的 Google 搜索词是“JPA 持久性提供程序”。答案已经在问题中了:/EclipseLink、Hibernate 等。真的很奇怪。 查看en.wikipedia.org/wiki/Java_Persistence_API 的底部以获取可用的 JPA 实现。任何互联网搜索都会回答您的“问题” 如果 JPA 规范是圣经,那么 JPA 提供者就是牧师。 @wypieprz 也许更像是“如果 JPA 规范是蓝图,JPA 提供者就是房子”...... 【参考方案1】:

为了提供进一步的解释,JPA 是在 JCP 框架中指定的 API,作为对请求的响应(例如,JSR 338 用于 JPA 2.1)。

该规范有几种实现方式,主要有:

EclipseLink Hibernate OpenJPA DataNucleus

在 Java 平台的框架中,当实现标准 API 时,这是通过称为 SPI(用于服务提供者接口)的系统指定的。 API 实现的每个“供应商”都必须提供一个特定的组件,该组件是一个单一的接口,作为实现类的起点。这是提供者一词的由来。

Java 教程包含一个example for the sound API。必须在名称 META-INF/services/MyFullInterfaceName 之后的 ClassLoader 可用的文件中提及实现类。

对于 JPA API,这个起点是PersistenceProvider 接口(注意包名中的 spi 部分)。每个实现都包含实现类的声明,例如在 eclipselink.jar 中可以找到一个文件 META-INF/services/javax.persistence.spi.PersistenceProvider (以完整的接口名称命名),它只包含提供者实现类的全名,在 EclipseLink 的情况下:

org.eclipse.persistence.jpa.PersistenceProvider

大多数时候,API 的应用程序客户端不必关心该声明,因为它包含在实现 JAR 中。应用程序必须使用这种文件的唯一情况是必须使用多个实现,例如使用 EclipseLink 和 Hibernate:

org.eclipse.persistence.jpa.PersistenceProvider
org.hibernate.ejb.HibernatePersistence

您会发现在 persistence.xml 文件中也指定了实现类( 标签)。

有时,JPA 提供程序表达式用于指代“供应商”(EclipseLink、Hibernate 等),而不是指软件组件。两者都可以被认为是有效的,具体取决于上下文。

【讨论】:

【参考方案2】:

你没看错,JPA 是持久性标准的规范。多个供应商已经实现了该规范,就像您提到的那些,但请注意 EclipseLink 是基于 TopLink 的,进一步的开发工作将主要用于 EclipseLink。

虽然您不能在没有提供程序的情况下使用 JPA,但您可以直接使用供应商实现,但您会将自己锁定到特定的提供程序,并失去一些好处,例如。便携性,但也获得了一些,例如超出规范的功能。

事实上,您的问题虽然措辞不同,但已在此处得到解答 What's the difference between JPA and Hibernate? 从线程中出现了以下博客 http://blog-tothought.rhcloud.com//post/2

【讨论】:

以上是关于什么是 JPA 提供者? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

什么是 Spring Data JPA 中的默认 ORM 提供程序

如何使用休眠将mysql与Java连接?例外:没有名为 org.hibernate.tutorial_jpa 的 EntityManager 的持久性提供程序 [关闭]

Hibernate 作为 JPA 提供者是啥意思? [复制]

JPA 实现——哪一个最好用? [关闭]

启动时的 JPA 自定义脚本

JPA