Spring Data JDBC / Spring Data JPA 与 Hibernate

Posted

技术标签:

【中文标题】Spring Data JDBC / Spring Data JPA 与 Hibernate【英文标题】:Spring Data JDBC / Spring Data JPA vs Hibernate 【发布时间】:2017-07-17 03:21:54 【问题描述】:

选择 的典型现实生活场景是什么?我想了解这两种实现中最适合的场景。

【问题讨论】:

你提到***.com/questions/28163670/jdbc-vs-hibernate了吗?? 嗨 @Akshay,我专门寻找 Spring Data JDBC 和 Spring Data JPA 的案例。 为什么选择?为什么不简单地使用带有 Hibernate 的 Spring Data JPA 作为 JPA 提供者...? 谢谢@FlorianSchaetz,使用 spring data jpa 和 hibernate 有什么好处吗?如果我只使用spring data jdbc,我也会失去任何东西吗? 没有这个关于 ORM 的讨论是不完整的:blogs.tedneward.com/post/the-vietnam-of-computer-science 【参考方案1】:

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

Ergo,如果不包含一些 JPA 实现,例如 Hibernate,就无法使用 Spring Data JPA。

您要问的基本问题是为什么使用 JDBC 与 ORM。为了了解您应该花时间了解 ORM 的好处。网上有很多文章可以告诉你。

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

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

【讨论】:

感谢 Naros,这很有帮助。 jdbc和orm场景都使用spring数据有什么好处? 正如 Jens 所指出的,spring data jdbc 官方并不存在,所以没有。 Spring Data JPA 使 ORM 的使用更容易,这基本上是 Spring 所做的:获取东西并使其更易于使用。 +1 表示“Spring Data JPA 只是一个以 spring 为中心的包装器,它提供了包装 JPA 提供者的弹性语义和特性”。如果您跟踪 spring-boot-starter-data-jpa POM 文件的依赖关系,您将看到其中之一是 org.hibernate.hibernate-core。 此答案已过时且不再正确。 Spring data jdbc 存在并且本身就是一个 ORM。【参考方案2】:

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

没有 Spring Data 的 JDBC

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

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

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

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

JOOQ

MyBatis

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

查询Dsl

使用 Spring Data 的 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 做了很多事情

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

通过查询自动创建实例

实体之间的导航

延迟加载

脏检查/跟踪实体更改

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

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

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

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

总结一下:

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

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

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

【讨论】:

如果你必须问自己“我是否需要通过 JDBC 进行细粒度控制”,你可能不需要它。如果你需要它,你会知道的,因为你已经深陷其中了。 Spring Data 是开发人员进行数据管理的最佳发明之一。我总是说:使用纯 JDCB 是没有意义的,和使用纯 JPA 一样。你必须知道什么时候混合它们。如果你使用 Java 而不是 Spring Data,你应该开始使用。 @Anddo 我想说的问题是:您是否从 JPA 的功能中获利,或者它们是否会妨碍您。 Spring Data JDBC 更简单:功能更少,但也更容易理解。 @Anddo:如果您正在寻找这两个出色框架之间的评估,请参考link @Anddo 很高兴你发现它很有趣。完全同意JPA解决了很多问题,使用什么取决于很多因素,完全是团队的选择。进行此练习的唯一目的是在做出如此艰难的决定时将这些数字摆在我们面前。接受您所面临的一小部分挑战并了解 Spring Data JDBC 如何解决这些挑战将会很有趣,您是否会遇到类似的头痛情况:)。如果你不介意把它们发给我。顺便说一句,感谢 JensSchauder 和团队,您已经完成了出色的工作,希望看到很多出色的工作。【参考方案3】:

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

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

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

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

【讨论】:

以上是关于Spring Data JDBC / Spring Data JPA 与 Hibernate的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JDBC 详解

Spring Data JDBC 详解

Spring Boot 自动重新配置在 spring-boot-data-starter-jdbc 上不起作用

spring-data-jdbc 中是不是有相当于@BatchSize

Spring data JDBC没有创建表

spring jdbc 事务脏读怎么解决