什么是 JPA 实现?

Posted

技术标签:

【中文标题】什么是 JPA 实现?【英文标题】:What is a JPA implementation? 【发布时间】:2011-05-27 11:58:46 【问题描述】:

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

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

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

【问题讨论】:

我建议您自己研究哪种实现与您的应用程序匹配。对某人“有效”的东西可能仅仅是因为那个人以前就知道。影响选择的因素有很多……许可证、支持、已知错误、可用功能、性能。仅仅因为别人做了就盲目地选择会导致大头疼 ;-) 【参考方案1】:

和Java一样,都有规范(Java SE、Java EE)和实现,大多数人使用参考实现(Sun / Oracle),这是其他人让自己“更好”和“高级”规范的实现(API、接口和文档/JavaDoc,如果你需要一个词的定义,虽然它远不止于此)

因此,您最有可能使用的 Java / JDK 只是一个实现(非常流行)。那里有更多的实现,有些有更多的垃圾收集配置选项,有些声称更快,有些则不值得使用。

所以这个实现基本上做了所有事情,它有代码,其中 JPA 是一个 API(由它的名字暗示,Java Persistance API),例如同样,更多的是关于接口和文档,而不是接口的实际实现。

将其视为 Hibernate 的 JPA 实现/EclipseLink 扩展/实现的抽象类

关于 JPA,与 Hibernate 具有单一实现不同,其想法是将接口与实现分离,这样“最好”的实现将获胜,并且每个人都可以参与游戏,而不仅仅是接口创建者.

这允许例如 Google App Engine 支持 JPA,因为它只需要遵循 API(DataNucleus 是实现)如果它必须使用 Hibernate,则需要修改 Hibernate 版本以支持 Google 的 Big Table格式(GAE 中的 JPA 不是那么好是另一回事)

【讨论】:

实际上大多数人在 JPA 的情况下使用“参考实现”(EclipseLink)是值得怀疑的。根据定义,RI 是规范可实施的概念证明;这就是标题的全部含义...... DataNucleus 是 JDO 的 RI,在相同的上下文中。它不是任何其他实现的蓝图——规范和 TCK 是实现是否正确的指南,当然不是 RI【参考方案2】:

JPA 只是一个需要实现才能使用的 API(因此是 Java Persistence API)。

类比是使用 JDBC。 JDBC 是用于访问数据库的 API,但您需要一个实现(驱动程序 jar 文件)才能连接到数据库。就其本身而言,如果没有驱动程序,您将无法对数据库进行任何操作。

正如我所说,使用 JPA,您需要一个实现,即一组位于“低于”JPA 的类,而这样的实现将满足您的需求。

您的应用程序使用 JPA API(这个措辞有点冗长,但我希望您明白),然后与底层实现进行通信。

流行的实现包括Hibernate、EclipseLink、OpenJPA 等。

每一个都实现了 JPA API,所以如果你只使用 JPA,每个实现都应该是一样的。

但是!这些实现提供的功能可能会超出标准 JPA API。

如果您想使用此特定功能,您将不得不使用与其他厂商不兼容的特定于供应商的 API。

例如,尽管 JPA 使用 ID 生成选项定义了 @Id 注释,但在使用 Hibernate 时,您也可以将 @org.hibernate.annotations.GenericGenerator 用于 Hibernate 特定的生成策略。

除非您使用 Hibernate 作为底层实现,否则使用此注解将不起作用。

底线是:JPA 是每个供应商实施的“最小公分母”,并且每个实施都可能具有一些非标准的更高级功能。

如果您希望您的应用程序具有可移植性,请仅使用 JPA。如果您确定以后不会改变主意并切换实现,请使用 JPA + 供应商特定功能。

【讨论】:

我找这个答案太久了,+1 用于明确解释通用 JPA 注释和特定 Hibernate 注释之间的区别。【参考方案3】:

JPA 本身只是一个规范,而不是产品;它本身不能执行持久性或其他任何事情。 JPA 只是一组接口,需要一个实现。有开源和商业 JPA 实现可供选择,任何 Java EE 5 应用程序服务器都应为其使用提供支持。 JPA 还需要一个数据库来持久化。

【讨论】:

【参考方案4】:

JPA 是一个 Java API 规范,它描述了使用 Java 平台的应用程序中的关系数据管理。您可以将 JPA 视为一组规则,因此它不能为您做任何具体的工作,但可以帮助您标准化您的实施。

所以你需要具体的实现来实现 JPA(规则集)。 Hibernate、OpenJPA 是少数著名的 JPA 实现。

【讨论】:

【参考方案5】:

Java Persistence API (JPA) 是一种 Java 编程语言应用程序编程接口规范,描述了使用 Java 平台标准版和 Java 平台企业版的应用程序中的关系数据管理。 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 文件)。

【讨论】:

以上是关于什么是 JPA 实现?的主要内容,如果未能解决你的问题,请参考以下文章

实现 Spring Security UserDetails 的 JPA 实体的含义是啥?

您将如何使 JPA 2.1 模块独立于 JPA 实现?

什么测试以及如何测试使用 JPA 实现的存储层

JPA:哪些实现支持延迟加载外部事务?

什么是jpa注解,为什么要用注解,注解的意义是什么?

使用Spring SecuritySpring Data Jpa实现的RBAC权限控制