当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA和Hibernate

姜业
2023-03-14

Spring Data JPA不是一个JPA实现,它是对数据库数据访问的抽象。我不能理解这种表达方式与JPA的实现(比如Hibernate)进行比较。在使用Spring Data JPA时,要使用CRUD操作,必须从CrudRepository接口进行扩展。但是没有Hibernate,Spring Data JPA无法独立工作,因为它无法将java对象转换为实体。但是!Hibernate还可以执行CRUD操作。所以问题是:1。如果我们仍然需要使用Hibernate,为什么开发人员使用Spring Data JPA(精确的CRUD操作)?2.CrudRepository接口只是一个接口,它是从“Repository”接口扩展而来的。我们在CRUD类中扩展它来实现CRUD操作。我不明白它是怎么运作的。我们的类如何简单地通过扩展接口来执行CRUD操作。没有实现的方法。我现在如何回答这些问题:

  1. 是为了简化代码。因为通过Hibernate使用CRUD操作需要更多的代码。
  2. 目前,只想到CrudRepository接口以某种(“神奇的”)方式使用标准Hibernate工具来使用CRUD操作。

共有1个答案

白赞
2023-03-14

JPA是一个规范,它指定了一组标准的类、方法、注释、约定等,用于将Java对象映射到关系数据库

Hibernate是该规范的实现之一。它实现了JPA规范中定义的所有内容。

Spring Data JPA是一个使用JPA的框架,因此需要一个JPA实现(Hibernate或其他任何一个)才能使用。它是建立在标准JPA规范之上的抽象层。

如果我们仍然需要使用Hibernate,为什么开发人员使用Spring Data JPA(精确的CRUD操作)?

因为Spring-Data-JPA使从Spring应用程序中使用JPA变得很容易,并且使定义存储库变得更容易:所有基本操作(如果不使用Spring-Data-JPA则通常必须手工编写)都已经由框架实现了。基于约定和声明性查询,它为您实现了方法,这使得编写起来更快、更安全、更不麻烦。

我不明白它是怎么运作的。我们的类如何简单地通过扩展接口来执行CRUD操作

它使用动态代理:在运行时,它使用反射检查存储库接口中定义的所有附加方法,并创建一个动态代理,即实现这个接口的类,使用标准JPA API实现接口中定义的方法。这是一个比较高级的话题。Google的“java动态代理”让你开始。但是你也可以只使用这个框架而不需要自己编写它,就像你使用计算机而不理解电子学是如何工作的一样。

 类似资料:
  • 我只想不使用xml,所以我需要非xml替代这些设置。这是我的POM。

  • 我的项目中的三个模型对象(本文末尾的模型和存储库片段)之间确实存在关系。 当我调用时,它会触发三个select查询: (“sql”) (对我来说)那是相当不寻常的行为。在阅读Hibernate文档后,我认为它应该始终使用连接查询。当类中的更改为时,查询没有区别(使用附加选择进行查询),当更改为时,城市类的查询也一样(使用JOIN进行查询)。 当我使用抑制火灾时,有两种选择: 我的目标是在所有情况下

  • 如何使用Spring Rest Controller和Spring Data JPA仅更新从@刚体传递的实体属性? 员工实体: 服务类方法: 请求体: Hibernate更新查询: Spring Data JPA正在尝试将company_id设置为空以进行更新,即使我没有将其传递给请求体?但是如果我从数据库中得到实体,使用employee_id传递,然后如果我试图保存(),那么它的工作正常。 我想

  • 我目前正在开发一个具有核心模块和不同“扩展”模块的应用程序。核心模块包括基于Spring配置类的JPA配置以及一些“基本”实体及其存储库,这些实体和存储库将在“扩展”模块中使用。扩展模块包含额外的实体类和JPARepositories。启动扩展模块的JUnit测试时,我遇到以下错误: 为了做到这一点,我尝试了三种不同的方法: 创建了一个名为coreEntityManager和setPackages

  • SpringDataJpa中 Specification怎样使用in查询 实体类Menu.java如下 想通过roles属性做in查询,代码如下 错误如下: Parameter value [com.appmtce.pojo.entity.role.Role@20f81e2a] did not match expected type [java.util.Collection (n/a)] 我的S

  • 我正在使用100个实体(使用JHipster)设置一个新的Spring Boot API,我的问题是:鉴于我有一组存储库层方法,我希望我的所有存储库都能够调用这些方法。 我已经尝试制作所有接口来扩展('RepositoryQuery'是我默认的自定义接口名称后缀),然后使用特定于实体的类。请注意,所有的类扩展了一个泛型实现类,名为。 请注意,给定正则表达式中的“.*”代表我的持久实体集中的任何实体

  • 我想根据我的输入选择列(列表 我知道要选择不同的特定列,我可以使用@Query("SELECT DISTINCT name OF TABLE"),但是,我想给用户选择他们想要的列的灵活性。列表

  • 我在SQLSerever中有一个数据库表,其中包含一些数据(最高id为360)。 现在,我想使用Spring数据JPA将新记录插入到这个表中。 有没有一种方法可以使新记录的id以增量方式跟随存量数据的id(即361、362等)? 寻找一种不会将我绑定到当前数据库的解决方案(即,不应阻止我将来无缝切换到另一个数据库)