什么是JPA实现?

use*_*525 36 java eclipse jpa eclipselink

我开始使用JPA了,我对JPA实现(EclipseLink,TopLink,Hibernate等)究竟是什么感到困惑.

我理解JPA的理论角色,但各种实现的目的是什么?这些选择之间是否存在显着差异,例如DB连接器/驱动程序?哪个是初学者最好的?

我可能会选择EclipseLink,因为这是我读过的大多数文献都使用的.

dar*_*ioo 83

JPA

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 +供应商特定功能.


Era*_*dan 6

它与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并不是那么好的另一个故事)

  • 实际上,大多数人在JPA的情况下使用"参考实现"(EclipseLink)是值得怀疑的.根据定义,RI是规范可实施的概念证明; 这就是所有标题的意思......在相同的上下文中,DataNucleus是JDO的RI.它不是任何其他实现的蓝图 - 规范和TCK是实现是否正确的指南,当然不是RI (3认同)