繁体   English   中英

JPA是否足以执行CRUD操作

[英]Is JPA enough to perform CRUD operations

几天来,我一直在研究JPA和Hibernate。 现在我对JPA - Hibernate交互感到困惑。 我知道JPA是一个规范,Hibernate实现它。 但缺少的是一个工作原则。 我的意思是在一个真实的应用程序中,hibernate做了什么以及jpa做了什么? 我试图得到以下问题。 让我问问你;

  1. 问题1: JPA只是抽象概念吗? 它只包含接口吗? (我观察到javax.persistance包中的每个都是interfce。)
  2. 问题2: JPA是否足以执行CRUD操作? (是否可以在没有Hibernate的情况下使用JPA等)如果确实如此,为什么我们需要JPA提供程序,如Hibernate等?
  3. 问题3:最后一个,我正在寻找具体的东西。 我需要知道Database-> JPA-> Hibernate交互。 例如,在保存和获取某些内容时,后台会发生什么?哪一个正在执行数据库操作(hibernate或jpa)或哪一个负责提供数据库连接?
    我的意思是,在基于jpa / hibernate的应用程序中, 负责 什么

问题1:

对,就是这样! JPA只是您已经知道的规范。 它只说可以做什么,但没有说明应该如何做或不做任何行为。 您可以将JPA注释与javax.persistence类一起使用,但最终在运行应用程序时不会发生任何事情!

问题2:

正如我上面所说,JPA只是一个蓝图,说明可以做些什么。 Hibernate,OpenJPA,Toplink等实际上实现了该规范。 它们以不同的方式执行操作,因此可能需要在速度等方面进行权衡,但所有这些操作都必须能够执行JPA指定的相同操作集。 有些可能会给你更多的功能,但永远不会少。

问题3:

JPA再次没有执行任何操作,它只是指定可以执行的操作。 它是如何完成的,如何执行代码< - > db交互,创建什么类型的SQL查询,它是所有特定于实现的并且会有所不同(例如,Hibernate可能为OpenJPA创建不同的SQL查询)。 最终如何执行数据库交互是在运行时由实现(Hibernate)确定的。 您可以尝试在具体实现的文档中找到所有内容。 您还可以打印例如执行的SQL。

您可能会问“那我为什么需要JPA” 那是因为你可以( 理论上! )通过将类路径上的jar更改为不同的库(即从Hibernate到Toplink)来更改实现 实际上,由于实现特定功能或每个实现如何处理SQL查询,表等,有时并不容易。

正如你自己提到的:JPA是一个规范,Hibernate是一个实现!

1:是的,正确这是Java接口形式的规范的技术部分。

2:不,JPA不够“,JPA无能为力,它只是一个规范。

3:交互仅存在于Hibernate和数据库之间(实际上,还有其他部分,如涉及数据库驱动程序,但不介意......)。

这种分离背后的想法是你可以编写仅使用javax.persistence接口的代码。 在一个地方,您(或者可能是像应用程序服务器这样的容器)定义您要使用的实现。 这使您的应用程序非常便携,您可以选择根据需要切换实现(从理论上讲,实际上它从未如此简单......)

正如您所说,JPA只是一个规范,因此没有实现,但每个Java EE容器都应该支持它(JPA的实现包含在应用程序服务器中)。

流行应用程序服务器中的JPA实现:

  • Glassfish - EclipseLink(参考实现)
  • JBoss - Hibernate
  • Websphere - 用于WebSphere Application Server持久性的JPA,Apache OpenJPA

因此,当您使用应用程序服务器时,您可以使用JPA接口通过特定的JPA实现执行任何CRUD操作。

Tomcat不支持JPA开箱即用。 只有在这些应用程序嵌入了一些JPA实现时,才能在部署在Tomcat上的应用程序中使用JPA。 或者使用为Tomcat提供JavaEE功能的Apache TomEE项目。

请记住,Hibernate具有JPA实现,但也有更多的成瘾(酷)功能。 但是,如果您只使用JPA规范中的元素,您可以随时轻松切换到另一个JPA实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM