我是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等提供程序。这是对的吗?
答案 0 :(得分:7)
为了提供进一步的解释,JPA是在JCP框架中指定的API,作为请求的答案(例如,JPA 2.1的JSR 338)。
存在该规范的几种实现,主要是:
在Java平台的框架中,当实现标准API时,这是通过名为SPI的系统(用于服务提供者接口)指定的。每个"供应商"实现必须提供一个特定的组件,它是一个单一的接口,作为实现类的起点。 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文件(< provider />标记)中找到实现类。
有时,JPA提供程序表达式用于引用" vendor" (EclipseLink,Hibernate等)而不是软件组件。根据具体情况,两者都可视为有效。
答案 1 :(得分:5)
你做得对,JPA是持久性标准的规范。并且多个供应商已经实现了规范,就像您提到的那样,但请注意EclipseLink基于TopLink,而进一步的开发工作将主要用于EclipseLink。
虽然您不能在没有提供商的情况下使用JPA,但您可以直接使用供应商实施,但是您可以将自己锁定到特定的提供商,并失去一些好处,例如:便携性,但也获得一些,例如超出规范的功能。
事实上,你的问题虽然措辞不同,但已在这里得到解答 What's the difference between JPA and Hibernate? 从线程中出现以下博客 http://blog-tothought.rhcloud.com//post/2