dar*_*ioo 83

JPA只是一个API(因此是Java Persistence API),需要使用实现.
一个类比就是使用JDBC.JDBC是用于访问数据库的API,但您需要一个实现(驱动程序jar文件)才能连接到数据库.如果没有驱动程序,您无法对数据库执行任何操作.
正如我所说,使用JPA,你需要一个实现,一组位于JPA"下面"的类,这样的实现将做你想要的.
您的应用程序使用JPA API(这个措辞有点古怪,但我希望您能得到这个想法),然后与底层实现进行通信.
流行的实现包括Hibernate,EclipseLink,OpenJPA等.
他们每个人都实现了JPA API,所以如果你只使用JPA,那么每个实现都应该是相同的.
但!这些实现提供的功能可能超出标准JPA API.
如果要使用此特定功能,则必须使用与其他API不兼容的供应商特定API.
例如,即使JPA @Id使用ID生成选项定义注释,在使用Hibernate时,您也可以使用@org.hibernate.annotations.GenericGeneratorHibernate特定的生成策略.
除非您使用Hibernate作为底层实现,否则使用此批注将不起作用.
底线是:JPA是每个供应商实现的"最小公分母",每个实现可能都有一些非标准的高级功能.
如果您希望应用程序可移植,请仅使用JPA.如果您确定以后不会改变主意并切换实现,请使用JPA +供应商特定功能.
它与Java相同,它有一个规范(Java SE,Java EE)和实现,大多数人使用参考实现(By Sun/Oracle),这是其他人制定自己"更好"和"高级"实现的蓝图规范(API,接口和文档/ JavaDoc,如果你需要一个单词定义,虽然它远不止于此)
所以你最有可能使用的Java/JDK只是一个实现(非常受欢迎).还有更多的实现,有些具有更多的垃圾收集配置选项,有些声称更快,有些则不值得使用.
所以实现基本上做了所有事情,它有代码,其中JPA是一个API(隐含在它的名字,Java Persistance API),例如,再次,更多关于接口和文档,而不是真正的接口实现.
可以把它想象成Hibernate的JPA实现/ EclipseLink扩展/实现的抽象类
关于JPA,与具有单个实现的Hibernate相反,其想法是将接口与实现分离,以便"最佳"实现将赢得并且每个人都可以参与游戏,而不仅仅是界面创建者.
这允许例如谷歌应用程序引擎,支持JPA,因为它只是需要遵循的API(DataNucleus将是实现),如果有使用Hibernate,它将要求修改Hiberanate发布支持谷歌的大表格式(在事实上,GAE中的JPA并不是那么好的另一个故事)