Spring 数据 JDBC / Spring 数据 JPA 与 Hibernate

Spring Data JDBC / Spring Data JPA vs Hibernate

人们会选择 Spring Data JDBC / Spring Data JPA 与 Hibernate 的典型现实生活场景是什么?我想了解最适合这些实现的场景。

您问题的一个问题是您似乎在暗示 Spring Data JPA 就像 Hibernate,但事实并非如此。 Spring Data JPA 仅仅是一个以 spring 为中心的包装器,它提供 springy 语义和功能来包装 JPA 提供程序,其中 Hibernate 是其一个实现。

因此,如果不包括一些 JPA 实现(如 Hibernate),则不能使用 Spring Data JPA。

您要问的基本问题是为什么使用 JDBC 而不是 ORM。为了理解,您应该花时间了解 ORM 的好处。互联网上有很多文章可以为您提供。

但即使在 ORM 驱动的应用程序中,有时您也会遇到需要绕过 ORM 框架并使用本机 SQL 的情况,就像在 JDBC 中一样。这些情况通常很少见,但是当您想利用某些不受支持的数据库功能或您希望最终控制结果操作等时,这些情况是必要的。

使用哪个的决定因素最终取决于您的应用程序的需求。但是仅仅因为您选择使用 ORM 框架并不会像在 JDBC 中那样相互排除执行本机查询和 SQL 语句的能力。这些功能仍然可用,您通常只是在极少数情况下使用它们。

正如@Naros 所说,目前标题中的问题并没有真正起作用。看来我们真的应该看看 4 个选项,并主要列出每种方法的优点,缺点是缺少另一种方法的优点:

JDBC 没有 Spring 数据

您可以 100% fine-grained 控制正在发生的事情。框架不会生成或注入任何内容。这听起来像是一个骗局,但如果您尝试调整映射和配置以获得一些 JPA 实现来执行您可以在 java 和 SQL 中简单写下的操作,您就会明白这可以成为一个大职业。

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

  • 没有要求如何建模域模型(例如 JPA 需要默认构造函数)

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

  • JOOQ

  • MyBatis

  • Spring JdbcTemplate(无需 Spring 的其余部分即可使用)

  • QueryDsl

JDBC 和 Spring 数据

您将受益于 Spring 数据,结合 JDBC(见上文):

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

  • 支持聚合。参见 https://spring.io/blog/2018/09/24/spring-data-jdbc-references-and-aggregates

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

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

  • 使用查询方法扩展存储库的好方法(您只需将接口定义为具有 findByLastName 方法,然后 Spring 为您动态生成)或 @Query 注释或自定义方法。

  • 支持分页

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

JPA 比 JDBC

做了很多事情
  • 缓存(第一级、第二级和查询缓存)

  • 根据查询自动创建实例

  • 实体间导航

  • 延迟加载

  • 脏检查/跟踪实体的变化

随着所有这些事情的发生,可能很难理解正在发生的事情和原因。当然 IFF 您正确地构建了您的应用程序,如果 JPA 没有提供您想要的东西,您可以退回到 JDBC。但我已经多次看到人们未能维护其工作所需的结构。显然,如果您没有正确理解 JPA 的工作原理,这将尤其困难。

具有 Spring 数据的 Hibernate(或其他一些 JPA 实现)

我在上面列出了Spring数据的好处,只需执行心理复制和粘贴即可。

当然,这使得完整的堆栈更加复杂。从许多标有 AND 的问题来看,许多开发人员似乎难以确定哪个工具可以做什么。但也从这些问题来看,大多数描述的是 Hibernate/JPA 而不是 Spring 数据的问题。

总结:

  • 如果你want/need fine-grained控制使用JDBC.

  • 如果您打算使用 JPA,请确保您尽早了解它。

  • 如果您选择的持久化技术 Spring Data 提供了一个模块,我会使用它。这将使生活更轻松。但我还是有偏见。

问题是 Spring jpa 的数据是对 jpa 的抽象,它是对 JDBC 的抽象。如果提供不错的功能,即使没有它也可以使用 jpa。它变得非常强大 Spring 数据休息。

但是一个框架为你做的事情越多,你就越需要了解底层技术。如果您使用 spring-data-rest,则更是如此。最好是先了解 sql(设计和查询),然后是 jpa(延迟加载、实例状态、实体、可嵌入、缓存、查询、事务同步)。

然后您尝试 spring-data-jpa 并确定它是否为您的项目带来价值。对于保存、更新、删除和通过 id 操作查找,它基本上是对 EntityManagerpersistmergeremovefind 方法的包装。 Spring 数据 JPA 的主要优点是查询支持,但 querydsl 也是一个不错的选择。在这两种情况下,都需要清楚地了解 JPA 的工作原理。首先要做的是打开 SQL 日志记录,以查看对于给定的数据库访问,您的 jpa 实现是否执行 dba 认为正确的查询。例如,预先加载不在缓存中的实体会导致 1+n select,您的单元测试将通过并且问题将在生产中开始。 spring-data-jpa 不会为您解决问题。

除了spring-data-jpa之外还有很多spring-data-*,其中一些还提供映射注释(例如spring-data-cassandra),其中当没有对象数据库映射时很有用。