Spring Data JDBC / Spring Data JPA与Hibernate的比较

53

在哪些实际场景下,人们会选择使用Spring Data JDBC / Spring Data JPA和Hibernate?我想了解何时使用这些实现最为适合。


你是否参考了 https://dev59.com/-l4c5IYBdhLWcg3wOoG6 ?? - Akshay
嗨@Akshay,我特别在寻找Spring Data JDBC和Spring Data JPA的案例。 - Punter Vicky
1
为什么要选择呢?为什么不直接使用Spring Data JPA与Hibernate作为JPA提供者呢? - Florian Schaetz
1
谢谢@FlorianSchaetz,使用Spring Data JPA和Hibernate有什么优点吗?如果我只使用Spring Data JDBC,会失去什么吗? - Punter Vicky
没有谈论ORM的完整内容是不完整的:http://blogs.tedneward.com/post/the-vietnam-of-computer-science/ - Jens Schauder
JDBC意味着需要手动完成很多工作。Spring使这个过程稍微容易一些。而JPA则允许你做更多的事情,这取决于你的使用情况。对于许多典型的应用程序来说,JPA会更加容易。 - Florian Schaetz
4个回答

104

正如@Naros所说,目前在标题中的问题并不是很适合。似乎我们应该真正考虑4个选项,并大多列出每种方法的优点,各自的缺点是其他方法的优点的缺失:

JDBC without Spring Data

您可以完全控制正在发生的事情。没有框架生成或注入任何内容。这可能听起来像一个缺点,但如果您尝试调整映射和配置以使某些JPA实现执行您可以轻松编写的Java和SQL操作,您就会明白这可能是一个很大的优点。

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

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

您可能希望使用一些库以减少样板代码。看看以下内容:

  • JOOQ

  • MyBatis

  • Spring JdbcTemplate(可在不使用Spring的其他功能的情况下使用)

  • QueryDsl

JDBC with Spring Data

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

  • 自带CRUD方法的Repositories。

  • 支持聚合。请参见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做很多事情

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

  • 从查询中自动创建实例

  • 实体之间的导航

  • 延迟加载

  • 跟踪对实体的更改

有了所有这些东西,理解正在发生的事情以及为什么会变得困难。当然,如果且仅如果您正确地构建应用程序结构,则可以回退到JDBC,如果JPA不提供所需功能。但我已经多次看到人们未能维护所需的结构。显然,如果您不正确地了解JPA的工作原理,这将特别困难。

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

我已经列出了Spring Data的好处,在心里进行复制和粘贴即可。

当然,这使得整个技术栈变得更加复杂。从许多标记有的问题来看,似乎许多开发者都难以确定哪个工具做了什么。但是从这些问题中大多数描述的情况来看,出现问题的并不是Spring Data,而是Hibernate/JPA。

总结一下:

  • 如果您想/需要精细地控制,请使用JDBC。

  • 如果要使用JPA,请确保早期理解它。

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


7
如果你不得不问自己“我是否需要通过JDBC进行细粒度控制”,那么你可能并不需要它。如果你需要它,你会知道的,因为你已经深陷其中了。 - Florian Schaetz
Spring Data 是开发人员进行数据管理的最佳发明之一。我总是说:使用纯 JDCB 是毫无意义的,就像使用纯 JPA 一样。你必须知道何时混合它们。如果你正在使用 Java 而没有使用 Spring Data,那么你应该开始使用它。 - Awi
1
@Anddo,我想说的问题是:你是否从JPA的特性中获益,还是它们只是阻碍了你。Spring Data JDBC 简单得多:功能较少,但也更容易理解。 - Jens Schauder
1
@Anddo:如果您正在寻找这两个精美框架的评估,请参考此链接。 - Maqbool Ahmed
1
@Anddo 很高兴你觉得它有趣。完全同意 JPA 解决了很多问题,使用取决于许多因素,这完全是团队的选择。做这个练习的唯一目的是在做出这些困难的决定时,让我们面前有这些数字。如果您遇到类似的头痛情况,将挑战的小集合与 Spring Data JDBC 相结合,会很有趣 : )。如果您不介意,请将它们发送给我。顺便说一句,感谢 JensSchauder 和团队,你们做得非常棒,希望看到更多好的工作。 - Maqbool Ahmed
显示剩余2条评论

18
你的问题存在一个误解,即认为Spring Data JPA类似于Hibernate,实际上并不是这样。Spring Data JPA只是一个以Spring为中心的包装器,提供了包装JPA提供程序(其中Hibernate是其中一种实现)的Spring样式语义和功能。
因此,您不能在没有包括Hibernate之类的JPA实现的情况下使用Spring Data JPA。
你所问的基本问题是为什么要使用JDBC而不是ORM。要理解这一点,应该花时间了解ORM的好处。互联网上有很多文章可以提供这方面的信息。
但即使在ORM驱动的应用程序中,也会有时候需要绕过ORM框架并使用原生SQL,就像在JDBC中一样。这些情况通常很少见,但在您想要利用某些不受支持的数据库特性或者想要完全控制操纵结果等情况下是必要的。
最终决定使用哪一种方法取决于你的应用需求。但选择使用ORM框架并不意味着不能像在JDBC中那样执行本地查询和SQL语句。这些功能仍然可用,只是通常在罕见的情况下使用。

谢谢Naros,这很有帮助。在JDBC和ORM场景中使用Spring Data的优点是什么? - Punter Vicky
正如Jens所指出的那样,Spring Data JDBC并不存在,因此没有。Spring Data JPA使使用ORM变得更加容易,这基本上就是Spring的作用:将东西变得更易于使用。 - Florian Schaetz
“Spring Data JPA仅是一个以Spring为中心的包装器,提供了Spring语义和功能,用于包装JPA提供程序。”如果您跟踪spring-boot-starter-data-jpa POM文件的依赖项,您会发现其中之一是org.hibernate.hibernate-core。 - Night Owl
2
这个答案已经过时,不再正确。Spring Data JDBC 存在并且本身就是一个 ORM。 - Oleg

3
事实上,Spring data for jpa是对jpa的抽象,而jpa又是对JDBC的抽象。它提供了一些不错的功能,即使没有它,jpa也是可用的。但如果使用Spring data rest,它会变得非常强大。
但是,框架为你做的越多,你就需要更多地了解底层技术。如果你使用spring-data-rest,这就更加真实了。最好的方法是从理解SQL(设计和查询)开始,然后是jpa(延迟加载、实例状态、实体、嵌入式、缓存、查询、事务同步)。
然后你可以尝试spring-data-jpa,并决定它是否为你的项目带来价值。对于保存、更新、删除和按ID查找操作,它基本上是EntityManager的persist、merge、remove和find方法的包装器。Spring data JPA的主要优点是查询支持,但querydsl也是一个不错的选择。在两种情况下,都需要清楚地了解JPA的工作原理。首先要做的是打开SQL日志,看看对于给定的db访问,你的jpa实现是否执行了dba认为正确的查询。例如,在未缓存的实体上进行急切加载会导致1+n选择,你的单元测试将通过,在生产中问题将开始出现。spring-data-jpa不能为你解决这个问题。
除了spring-data-jpa之外,还有许多spring-data-*,其中一些也提供映射注释(例如spring-data-cassandra),这在没有对象-db映射时非常有用。

2
我在寻找答案,以下对比摘自《Java Persistent with Spring Data and Hibernate》
我可以得出的结论是:可能会出现需要使用Spring Data JPA提供的特定于数据库的功能进行自定义功能的情况。或者,我们想避免Spring Data的魔力带来的复杂性。
Spring Data JPA与Spring Data JDBC的区别如下表:
Spring Data JPA Spring Data JDBC
独立于数据库且可移植 通常是特定于数据库的
通过对象关系映射引入复杂性 较简单,仍遵循Spring框架原则
基于实体自动生成模式 程序员通过DDL命令生成模式
自第一个版本以来就具有查询派生 自2.0版本以来具有查询派生
使用JPQL代码和本地SQL注释的查询 仅使用本地SQL的查询
可以重用带有JPA注释的类。 使用org.springframework.data包中的注释
通过注释,如@OneToMany、@Embedded等,对实体之间的关系进行建模。 主要在程序员的一侧通过类的设计来建模关系。
缓存和延迟加载 无缓存、无延迟加载
会话和脏跟踪 没有会话,没有脏跟踪

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接