我开始使用JPA了,我对于JPA实现(EclipseLink,TopLink,Hibernate等)究竟是什么感到困惑。
我理解JPA的理论角色,但各种实现的目的是什么?这些选择之间是否存在显着差异,例如DB连接器/驱动程序?哪个是初学者最好的?
我可能会选择EclipseLink,因为这是我读过的大部分文献都使用的。
答案 0 :(得分:79)
JPA只是一个API(因此Java持久性 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.GenericGenerator
来实现Hibernate特定的生成策略。
除非您使用Hibernate作为底层实现,否则使用此批注将无效。
底线是:JPA是每个供应商实现的“最小公分母”,每个实现都可能有一些非标准的高级功能。
如果您希望您的应用程序可移植,请仅使用JPA。如果您确定以后不会改变主意并切换实现,请使用JPA +供应商特定功能。
答案 1 :(得分:6)
它与Java相同,它有一个规范(Java SE,Java EE)和实现,大多数人使用参考实现(By Sun / Oracle),这是其他人的蓝图,使他们自己“更好”和“高级“规范的实现(API,接口和文档/ JavaDoc,如果你需要一个单词的定义,虽然它不仅仅是那个)
因此,您最有可能使用的Java / JDK只是一种实现(非常受欢迎)。还有更多的实现,有些具有更多的垃圾收集配置选项,有些声称更快,有些则不值得使用。
所以实现基本上做了所有事情,它有代码,其中JPA是一个API(由它的名字暗示,Java Persistance API),例如再次,更多关于接口和文档,而不是真正的接口实现。
将其视为Hibernate的JPA实现/ EclipseLink扩展/实现的抽象类
关于JPA,与具有单一实现的Hibernate相反,其想法是将接口与实现分离,以便“最佳”实现将获胜并且每个人都可以参与游戏,而不仅仅是界面创建者
这允许例如Google App Engine支持JPA,因为它只需要遵循API(DataNucleus就是实现)如果它必须使用Hibernate,它就需要修改Hiberanate版本以支持Google的Big Table格式(GAE中的JPA不是那么好的事实是另一个故事)
答案 2 :(得分:4)
JPA本身只是一个规范,而不是产品;它本身不能执行持久性或其他任何事情。 JPA只是一组接口,需要实现。有开源和商业JPA实现可供选择,任何Java EE 5应用服务器都应该为其使用提供支持。 JPA还需要一个数据库来持久化。
答案 3 :(得分:1)
Java Persistence API(JPA)是一种Java编程语言应用程序编程接口规范,它描述了使用Java Platform,Standard Edition和Java Platform,Enterprise Edition在应用程序中管理关系数据。 Java Persistence API起源于Java Community Process的JSR 220专家组的工作的一部分。 JPA 2.0是JSR 317专家组的工作。
因此,JPA提供了必须实现的一组接口。总是有可用于语言规范的参考实现,在这种情况下,EclipseLink是参考实现。
另一方面,Hibernate实现了JPA规范,但它也拥有自己的原生API。
例如:
假设您设计了一个只包含一个界面的身份验证规范:
public interface AccessAuthenticator {
public boolean verifyAccess(String username,String saltedPassword);
}
现在这个规范只包含一个接口和一个方法。
为了使用此规范(更确切地说是verifyAccess()方法),您必须具有实现。
此规范可以有许多实现。例如,某些组织可能会为其自己的服务器提供身份验证的实现。您必须具有该实现才能连接到组织服务器(可能涉及一些本机API)。
提供规范的另一个方面是你实际上没有使用任何东西的具体实现,所以今天说你正在使用hibernate连接到你的数据库但是明天一些更好的ORM出现在实现JPA规范的图片中,然后您需要做的就是更改项目中的依赖项(简单来说就是替换实现JAR文件/编辑pom文件)。
答案 4 :(得分:0)
JPA是一个Java API规范,它描述了使用Java Platform管理应用程序中的关系数据。您可以将JPA视为一组规则,因此它不能为您做任何具体的工作,但可以帮助您标准化您的实现。
所以你需要具体的实现来实现JPA(规则集)。 Hibernate,OpenJPA是很少有着名的JPA实现。