Java JPA是否足以执行CRUD操作

Java JPA是否足以执行CRUD操作,java,hibernate,jpa,Java,Hibernate,Jpa,几天来,我一直在研究JPA和Hibernate。 现在我对JPA和Hibernate的交互感到困惑。 我知道JPA是一种规范,Hibernate实现了它。但缺少的一点是工作原理。我的意思是在一个实际的应用程序中,hibernate做什么,jpa做什么?我试图回答以下问题。让我问你 问题1:JPA只是一个抽象概念吗?它是否只包含接口?(我观察到每一件事都是相互影响的 javax.persistence包。) 问题2:JPA是否足以执行CRUD操作?(是否可以在没有Hibernate等的情况下使用J

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

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

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

    1:是的,请更正,这是规范中以Java接口形式出现的技术部分

    2:不,JPA是不够的,JPA什么都做不了,它只是一个规范

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


    这种分离背后的思想是,您可以编写只使用
    javax.persistence
    接口的代码。在一个地方(或者像应用服务器这样的容器)定义要使用的实现。这使得您的应用程序非常可移植,您可以选择根据自己的喜好切换实现(理论上,在实践中从来没有那么容易…

    问题1:

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

    问题2:

    正如我上面所说,JPA只是一个蓝图,说明可以做些什么。Hibernate、OpenJPA、Toplink等实际上实现了该规范。它们以不同的方式执行操作,因此在速度等方面可能会有折衷,但它们都必须能够执行JPA指定的相同操作集。有些可能会为您提供更多功能,但绝不会减少

    问题3:

    同样,JPA没有执行任何操作,它只是指定可以执行的操作。它是如何完成的,代码数据库交互是如何执行的,创建了什么样的SQL查询,这些都是特定于实现的,并且会有所不同(例如,Hibernate可能会为同一事物创建不同于OpenJPA的SQL查询)。数据库交互的最终执行方式由实现(Hibernate)在运行时决定。您可以尝试在具体实施的文档中找到所有内容。例如,您还可以打印执行的SQL


    你可能会问:“那我为什么需要JPA?”?这是因为(理论上!)只需将类路径上的jar更改为另一个库(即从Hibernate到Toplink),就可以更改实现。在实践中,由于实现特定的特性或每个实现如何处理SQL查询、表等,有时并不那么容易。

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

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

    • Glassfish-EclipseLink(参考实现)
    • JBoss-Hibernate
    • Websphere-JPA for Websphere Application Server持久化,Apache OpenJPA
    所以,当您使用ApplicationServer时,可以使用JPA接口通过特定的JPA实现执行任何CRUD操作

    Tomcat不支持现成的JPA。只有当部署在Tomcat上的应用程序嵌入了一些JPA实现时,才能在这些应用程序中使用JPA。或者使用ApacheTomee项目,该项目为Tomcat提供JavaEE特性


    请记住,Hibernate有JPA实现,但也有更令人上瘾(酷)的特性。但是,如果您只使用JPA规范中的元素,您可以随时轻松地切换到另一个JPA实现。

    我很高兴您了解这个博客。谢谢你分享库马尔。我的名字是普拉萨德,不是库马尔:)很抱歉给你带来困惑。我有一个朋友叫普拉萨德·库马尔:-)谢谢你,哈卡尔;)另外,使用JPA对其他程序员来说也很方便。当一位新同事开始编写您的代码时,他将很容易阅读JPA代码。@Gondy-well-yes-true使用标准/规范通常更容易使用:-)感谢您的努力Mateusz。我是如此接近清楚,但还没有:)最后一个,你能请访问下面的博客,并解释虽然没有实现hibernate,我们如何使用jpa进行crud操作?等待您的回复,谢谢:-)@MesutDogan实际上他正在使用JPA的实现之一
    EclipseLink
    !如果你查看他贴在底部的项目结构图,你会看到
    EclipseLink 2.5.0-Kepler
    。这是由
    Eclipse
    添加的,您可以在Eclipse中创建
    JPA项目时选择实现。@Mateusz哇!现在一切都清楚了!非常感谢:)谢谢你的澄清Partyjcja。谢谢你的澄清。