什么是JPA提供程序?

8
我对JPA还不熟悉。据我了解,JPA本身不能进行持久化操作,需要使用JPA提供程序将数据持久化到数据库中。 JPA提供程序是包含JPA规范(javax.persistence)的厂商产品,例如Eclipselink、Toplink、Hibernate等。 http://www.tutorialspoint.com/jpa/jpa_orm_components.htm 因此,任何想要使用JPA进行持久化的应用程序都必须使用类似于Eclipselink、Toplink、Hibernate等提供程序。这样说是否正确?

5
你有问题吗? - Kayaman
3
问题在标题中。什么是“JPA提供者”?没有,因为正确的谷歌搜索词是“JPA持久化提供者”。而答案已经在问题中了:/ EclipseLink,Hibernate等。确实很奇怪。 - Gimby
请查看https://en.wikipedia.org/wiki/Java_Persistence_API底部,以获取可用的JPA实现。任何互联网搜索都可以回答您的“问题”。 - Neil Stockton
如果JPA规范是圣经,那么JPA提供者就是牧师。 - wypieprz
@wypieprz 或许更像是“如果JPA规范是蓝图,那么JPA提供者就是房子”… - jpangamarca
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
9
为了进一步解释,JPA是作为回答请求(例如JSR 338用于JPA 2.1)在JCP框架中指定的API。 该规范有几个实现,主要包括: - EclipseLink - Hibernate - OpenJPA - DataNucleus 在Java平台的框架下,当实现标准API时,这是通过称为SPI(服务提供者接口)的系统进行指定的。每个API实现的“供应商”必须提供一个特定组件,作为实现类的起点的单个接口。这就是“provider”一词的起源。 Java教程包含一个声音API的示例example for the sound API。实现类必须在文件中提到,该文件可在ClassLoader之后使用META-INF/services/{{MyFullInterfaceName}}名称。

对于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文件中也指定了实现类(<provider/>标签)。

有时,JPA提供程序表达式用于引用“供应商”(EclipseLink、Hibernate等),而不是软件组件。根据上下文,两者都可以被视为有效。


6
你说得没错,JPA是持久化标准的规范。多个供应商已经实现了这个规范,就像你提到的那些一样,不过要注意的是EclipseLink基于TopLink,并且进一步的开发工作将主要集中在EclipseLink上。 虽然你不能没有提供者使用JPA,但你可以直接使用供应商的实现,但这样你就会锁定自己到特定的供应商,并失去一些好处,例如可移植性,但也获得了一些好处,例如超出规范的功能。 实际上,你的问题,尽管措辞不同,已经在这里得到了回答 JPA和Hibernate有什么区别?,并伴随着以下来自该线程的博客 http://blog-tothought.rhcloud.com//post/2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,