什么是JPA提供商?

我是JPA的新手。 根据我的理解,JPA本身不能做持久性。 它需要JPA Provider才能将数据持久化到数据库中。

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

因此,任何想要使用JPA进行持久化的应用程序都必须使用Eclipselink,Toplink,Hibernate等提供程序。 它是否正确?

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

存在该规范的几种实现,主要是:

  • 的EclipseLink
  • 过冬
  • OpenJPA的
  • DataNucleus将

在Java平台的框架中,当实现标准API时,这通过称为SPI (用于服务提供者接口)的系统来指定。 实现的每个“供应商”必须提供特定组件,该组件是单个接口,作为实现类的起点。 Java教程包含声音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等)而不是软件组件。 根据具体情况,两者都可视为有效。

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

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

实际上你的问题虽然措辞不同已经在这里得到解答JPA和Hibernate有什么区别? 以下博客出现在主题http://blog-tothought.rhcloud.com//post/2上