Spring数据JDBC/Spring数据JPA vs Hibernate

Spring数据JDBC/Spring数据JPA vs Hibernate,hibernate,spring-data,spring-data-jpa,spring-data-jdbc,Hibernate,Spring Data,Spring Data Jpa,Spring Data Jdbc,选择SpringDataJDBC/SpringDataJPA与Hibernate的典型现实场景是什么?我想了解这两种实现最适合的场景。您的问题的一个问题是您似乎暗示Spring Data JPA类似于Hibernate,但事实并非如此。SpringDataJPA只是一个以Spring为中心的包装器,它提供了灵活的语义和特性,包装了JPA提供者,Hibernate就是其中的一个实现 因此,如果不包括一些JPA实现(如Hibernate),就不能使用Spring数据JPA 那么您要问的基本问题是为什

选择SpringDataJDBC/SpringDataJPA与Hibernate的典型现实场景是什么?我想了解这两种实现最适合的场景。

您的问题的一个问题是您似乎暗示Spring Data JPA类似于Hibernate,但事实并非如此。SpringDataJPA只是一个以Spring为中心的包装器,它提供了灵活的语义和特性,包装了JPA提供者,Hibernate就是其中的一个实现

因此,如果不包括一些JPA实现(如Hibernate),就不能使用Spring数据JPA

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

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


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

正如@Naros所说,当前标题中的问题实际上不起作用。似乎我们真的应该看看4个选项,主要列出每种方法的优点,缺点是缺少其他方法的优点:

没有Spring数据的JDBC

您可以100%细粒度地控制正在发生的事情。框架不会生成或注入任何内容。这听起来可能是个骗局,但如果您试图调整映射和配置,让一些JPA实现完成您可以在java和SQL中轻松编写的工作,您就会明白这是一个巨大的优势

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

  • 不要求如何对域模型建模(例如,JPA需要默认构造函数)
您可能想使用一些库来减少样板代码。看看:

  • 约克

  • MyBatis

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

  • QueryDsl

带有Spring数据的JDBC

您可以从Spring数据和JDBC数据中获得好处(见上文):

  • 具有现成CRUD方法的存储库

  • 对集合的支持。看

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

  • 它仍然是一个非常简单的编程模型。SQL语句恰好在人们预期的时间发生,如果您愿意,您可以回到简单的JDBC,不管是否支持其他框架,而不破坏任何抽象

  • 使用查询方法(您只需定义接口,使其具有
    findByLastName
    方法,Spring会动态为您生成该方法)或
    @query
    注释或自定义方法,就可以轻松地扩展存储库

  • 支持分页

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

JPA通过JDBC做了很多事情

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

  • 根据查询自动创建实例

  • 实体之间的导航

  • 延迟加载

  • 对实体更改的脏检查/跟踪

随着所有这些事情的发生,很难理解发生了什么以及为什么。当然,如果您正确地构造了应用程序,那么如果JPA不能提供您想要的内容,您可以求助于JDBC。但我已经多次看到人们未能维持工作所需的结构。显然,如果你不能正确理解JPA是如何工作的,这就特别困难

使用Spring数据休眠(或其他一些JPA实现)

我在上面列出了Spring数据的优点,只需执行一个心智复制和粘贴

当然,这使得整个堆栈更加复杂。从许多带有标记的问题来看,似乎许多开发人员在识别哪个工具做什么方面存在问题。但从这些问题来看,大多数描述的是Hibernate/JPA的问题,而不是Spring数据

总结一下:

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

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

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


    • 问题是,jpa的Spring数据是对jpa的抽象,是对JDBC的抽象。If提供了很好的特性,即使jpa没有它也可以使用。通过SpringDataREST,它变得非常强大

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

      然后您尝试SpringDataJPA,并决定它是否为您的项目带来价值。