当前位置: 首页 > 面试题库 >

Spring Data JDBC / Spring Data JPA与Hibernate

丁经国
2023-03-14
问题内容

在哪些典型的现实生活场景中,人们会选择Spring Data JDBC / Spring Data
JPA与Hibernate?我想了解最适合这两种实现方式的场景。


问题答案:

正如@Naros所说,标题中当前存在的问题实际上并没有解决。似乎我们应该真正看一下4个选项,并且主要列出每种方法的优点,缺点是没有其他方法的优点:

没有Spring数据的JDBC

您可以对所发生的事情进行100%的细粒度控制。框架不会生成或注入任何内容。这听起来像是一个弊端,但是如果您尝试调整映射和配置以使某些JPA实现执行您可以用Java和SQL轻松编写的功能,那么您将了解,这可能是一个好专家。

您不必学习JPA或Spring Data。我个人认为Spring
Data很容易,但是我有偏见(请参阅我的个人资料)。但是,一旦您离开了琐碎的实体和设置领域,JPA无疑是具有挑战性的。

  • 无需建模域模型(例如,JPA需要默认构造函数)

您可能想使用一些库来减少样板代码。看一眼:

  • York

  • MyBatis

  • Spring JdbcTemplate(在没有Spring其余部分的情况下可用)

  • QueryDsl

JDBC与Spring数据

您将获得Spring Data与JDBC相结合的好处(请参见上文):

  • 开箱即用CRUD方法的存储库。

  • Spring基础结构中的良好集成,用于事务处理,依赖项注入,错误转换,分页…

  • 它仍然是一个非常简单的编程模型。SQL语句恰好在人们期望它们发生的时间发生,并且如果您愿意,可以在不破坏任何抽象的情况下,在有或没有其他框架支持的情况下退回到简单的JDBC。

虽然尚不可用,但将来的更新将为您带来更多好处:

  • 使用查询方法(只需将接口定义为具有findByLastName方法,Spring便会为您动态生成它)来扩展存储库的好方法,也可以使用@query注释或自定义方法。

  • 支持分页

没有Spring数据的Hibernate(或其他JPA实现)

JPA通过JDBC做了很多事情

  • 缓存(第一级,第二级和查询缓存)

  • 通过查询自动创建实例

  • 实体间导航

  • 延迟加载

随着所有这些事情的发生,可能很难理解正在发生的事情和原因。当然, IFF
可以正确地构建应用程序的结构,如果JPA没有提供所需的功能,则可以使用JDBC。但是我多次看到人们未能维持其正常工作所需的结构。显然,如果您不正确地理解JPA的工作原理,那么这尤其困难。

使用Spring Data进行Hibernate(或其他JPA实现)

我在上面列出了Spring Data的好处,只需进行简单的复制和粘贴即可。

当然,这会使整个堆栈变得更加复杂。从用spring-
data和hibernate标记的许多问题看来,许多开发人员在确定哪个工具执行功能时遇到了问题。而且从这​​些问题来看,大多数描述的是Hibernate /
JPA而不是Spring Data的问题。

总结一下:

  • 如果要/需要细粒度的控制,请使用JDBC。

  • 如果您要使用JPA,请确保您早日了解它。

  • 如果您选择的持久性技术是Spring Data提供的模块,那么我会使用它。这将使生活更轻松。但是我再次有偏见。



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

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

  • 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'是我默认的自定义接口名称后缀),然后使用特定于实体的类。请注意,所有的类扩展了一个泛型实现类,名为。 请注意,给定正则表达式中的“.*”代表我的持久实体集中的任何实体

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

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

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

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