35

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

4

3 回答 3

86

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

没有 Spring 数据的 JDBC

您可以对正在发生的事情进行 100% 的细粒度控制。框架不会生成或注入任何内容。这听起来像是一个骗局,但是如果您尝试调整映射和配置以使一些 JPA 实现来完成您可以用 Java 和 SQL 轻松写下的事情,您就会明白这可能是一个大专家。

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

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

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

  • JOOQ

  • MyBatis

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

  • 查询Dsl

带有 Spring 数据的 JDBC

您将获得 Spring Data 的优势,以及 JDBC 的优势(见上文):

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

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

  • 在 Spring 基础设施中的良好集成,用于事务处理、依赖注入、错误翻译、分页......

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

  • 使用查询方法(您只需定义接口以拥有一个findByLastName方法,Spring 会为您即时生成它)或@Query注释或自定义方法来扩展您的存储库的好方法。

  • 支持分页

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

JPA 通过 JDBC 做了很多事情

  • 缓存(一级、二级和查询缓存)

  • 从查询自动创建实例

  • 实体之间的导航

  • 延迟加载

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

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

使用 Spring Data 进行休眠(或其他一些 JPA 实现)

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

当然,这使得整个堆栈更加复杂。从标记为的许多问题来看,似乎许多开发人员在确定哪个工具做什么时遇到了问题。但也从查看这些问题来看,大多数描述的是 Hibernate/JPA 而不是 Spring Data 的问题。

总结一下:

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

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

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

于 2017-02-27T14:44:36.317 回答
18

您的问题的一个问题是您似乎暗示 Spring Data JPA 就像 Hibernate 一样,这实际上不是真的。Spring Data JPA 只是一个以 spring 为中心的包装器,它提供弹性语义和包装 JPA 提供者的特性,其中 Hibernate 是其中一个实现。

因此,如果不包含一些 JPA 实现,例如 Hibernate,就不能使用 Spring Data JPA。

您要问的基本问题是为什么使用 JDBC 与 ORM。为了了解您应该花时间了解 ORM 的好处。互联网上有许多文章可以为您提供这一点。

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

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

于 2017-02-26T19:22:41.050 回答
3

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

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

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

除了 spring-data-jpa 之外还有很多 spring-data-*,其中一些还提供映射注释(例如 spring-data-cassandra),这在没有 object-db 映射时很有用。

于 2019-01-19T21:28:34.617 回答