什么是 JPA 实现?
我正在开始使用JPA,我对JPA实现(EclipseLink,TopLink,Hibernate等)究竟做了什么感到困惑。
我理解JPA的理论作用,但是各种实现的目的是什么?这些选择之间是否存在显著差异,例如数据库连接器/驱动程序?哪个是初学者最好的?
我可能会选择EclipseLink,因为这是我读过的大多数文献都使用的东西。
我正在开始使用JPA,我对JPA实现(EclipseLink,TopLink,Hibernate等)究竟做了什么感到困惑。
我理解JPA的理论作用,但是各种实现的目的是什么?这些选择之间是否存在显著差异,例如数据库连接器/驱动程序?哪个是初学者最好的?
我可能会选择EclipseLink,因为这是我读过的大多数文献都使用的东西。
JPA只是一个API(因此是Java Persistence API),需要一个实现才能使用。
一个类比是使用JDBC。JDBC 是用于访问数据库的 API,但您需要一个实现(驱动程序 jar 文件)才能连接到数据库。就其本身而言,如果没有驱动程序,则无法对数据库执行任何操作。
对于JPA,正如我所说,你需要一个实现,一组位于JPA“之下”的类,这样的实现将做你想要的。
您的应用程序使用JPA API(这个措辞有点笨拙,但我希望您理解这个想法),然后与底层实现进行通信。
流行的实现包括Hibernate,EclipseLink,OpenJPA等。
它们中的每一个都实现了JPA API,因此,如果您仅使用JPA,则每个实现的行为都应该相同。
但!这些实现提供的功能可能超出了标准的 JPA API。
如果要使用此特定功能,则必须使用与其他功能不兼容的供应商特定 API。
例如,即使 JPA 使用 ID 生成选项定义了注释,但在使用 Hibernate 时,您也可以用于特定于 Hibernate 的生成策略。@Id
@org.hibernate.annotations.GenericGenerator
除非您使用Hibernate作为基础实现,否则使用此注释将不起作用。
底线是:JPA是每个供应商实现的“最小公分母”,每个实现都可能具有一些不标准的更高级的功能。
如果希望应用程序可移植,请仅使用 JPA。如果您确定以后不会改变主意并切换实现,请使用 JPA + 供应商特定的功能。
它与Java相同,它有一个规范(Java SE,Java EE)和实现,大多数人使用参考实现(By Sun / Oracle),这是其他人的蓝图,可以使自己的规范“更好”和“高级”实现(API,接口和文档/ JavaDoc,如果你需要一个单词定义,尽管它远不止于此)
因此,您最有可能使用的Java / JDK只是一个实现(非常流行)。还有更多的实现,有些有更多的垃圾回收配置选项,有些声称更快,有些只是不值得使用。
因此,该实现基本上可以完成所有操作,它具有代码,其中JPA是一个API(由它的名称Java Persistance API暗示),例如,更多的是关于接口和文档,而不是接口的真正含义。
可以把它想象成Hibernate的JPA实现/ EclipseLink扩展/实现的abstact类
关于JPA,与具有单一实现的Hibernate相反,其想法是将接口与实现分离,以便“最佳”实现获胜,并且每个人都可以参与游戏,而不仅仅是接口创建者。
例如,这允许Google App Engine支持JPA,因为它只需要遵循API(DataNucleus是实现),如果它必须使用Hibernate,它将需要修改Hiberanate版本以支持Google的Big Table格式(GAE中的JPA不是那么好是另一回事)