Spring Data JDBC / Spring Data JPA vs Hibernate

时间:2017-02-26 15:01:31

标签: hibernate spring-data spring-data-jpa spring-data-jdbc

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

5 个答案:

答案 0 :(得分:34)

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

没有Spring数据的JDBC

您可以100%细致地控制正在发生的事情。框架不会生成或注入任何内容。这可能听起来像一个con,但是如果你试图调整映射和配置以使一些JPA实现去做你可以在java和SQL中写下来的东西,你就会明白这可能是一个很大的专业。< / p>

您不必学习JPA,也不需要学习Spring Data。我个人认为Spring Data很简单,但我有偏见(见我的个人资料)。但是,一旦你离开了琐碎的实体和设置区域,JPA肯定是具有挑战性的。

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

您可能希望使用某些库来减少样板代码。看看:

  • JOOQ

  • MyBatis的

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

  • QueryDsl

使用Spring Data的JDBC

您可以获得Spring Data的优势,结合JDBC的优势(见上文):

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

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

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

虽然尚不可用,但您将在未来的更新中获得更多好处:

  • 使用查询方法扩展存储库的简单方法(您只需将接口定义为findByLastName方法,Spring即可为您生成)或@query注释或自定义方法。

  • 支持分页

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

JPA在JDBC上做了很多事情

  • 缓存(第1级,第2级和查询缓存)

  • 从查询中自动创建实例

  • 实体之间的导航

  • 延迟加载

发生所有这些事情后,很难理解发生了什么以及为什么。当然 IFF 你正确地构建你的应用程序,如果JPA没有提供你想要的东西,你可以回到JDBC上。但我已多次看到人们未能保持其工作所需的结构。显然,如果你不能正确理解JPA的工作原理,这一点尤其困难。

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

我列出了上面Spring Data的优点,只需执行精神复制和粘贴。

当然,这使得完整的堆栈更加复杂。从使用spring-data和hibernate标记的许多问题来看,似乎许多开发人员在识别哪个工具做什么方面存在问题。但是,从查看这些问题来看,大多数问题都是用Hibernate / JPA而不是Spring Data来解决的。

将其打包:

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

  • 如果您要使用JPA,请务必尽早了解JPA。

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

答案 1 :(得分:4)

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

Ergo,如果不包含一些像Hibernate这样的JPA实现,就不能使用Spring Data JPA。

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

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

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

答案 2 :(得分:1)

签出requery.io, 重新查询可提供性能和ORM。

还要签出spring-data-requery

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

免责声明:我是我要推荐的lib的作者。

如果您对将Querydsl与Spring Data JDBC或Spring Data JPA一起使用感兴趣,则可以考虑使用https://github.com/infobip/infobip-spring-data-querydsl

对于功能集,我建议您签出项目README.md,但总的来说它提供:

  • 无需任何maven插件配置或数据库连接即可为JDBC或JPA模块生成querydsl Q类-一个依赖性,您就可以包含并配置注释处理器
  • 对JDBC模块的完全Querydsl SQL支持(SQLQuerySQLUpdateClause和使用Predicate删除)
  • 对JPA模块(JPASQLQueryJPAQueryJPAUpdateClause并使用Predicate删除)的完全Querydsl SQL JPA支持
  • 还有更多...