JPA是否足以执行CRUD操作

Mes*_*gan 4 java hibernate jpa

几天来,我一直在研究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 /休眠基础的应用,负责是什么

Mat*_*zyk 7

问题1:

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

问题2:

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

问题3:

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

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