Hibernate和Spring Data JPA有什么区别

时间:2014-05-26 05:00:32

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

Hibernate和Spring Data JPA之间的主要区别是什么?什么时候不应该使用Hibernate或Spring Data JPA?另外,Spring JDBC模板何时可以比Hibernate / Spring Data JPA更好地运行?

6 个答案:

答案 0 :(得分:207)

Hibernate是一个JPA实现,而Spring Data JPA是一个JPA数据访问抽象。 Spring Data为GenericDao自定义实现提供了解决方案。它还可以通过方法名称约定代表您生成JPA查询。

使用Spring Data,您可以使用Hibernate,Eclipse Link或任何其他JPA提供程序。一个非常有趣的好处是you can control transaction boundaries declaratively using the @Transactional annotation

Spring JDBC更轻量级,并且它用于本机查询,如果您只打算单独使用JDBC,那么最好使用Spring JDBC来处理JDBC详细程度。

因此,Hibernate和Spring Data是互补而非竞争对手。

答案 1 :(得分:102)

我们在这里使用了3种不同的东西:

  1. JPA:Java持久性api,提供持久化,读取,管理数据从java对象到数据库中关系的规范。
  2. Hibernate:有各种提供者实现jpa。 Hibernate就是其中之一。所以我们也有其他提供商。但是如果使用带弹簧的jpa,它允许你将来切换到不同的提供商。
  3. Spring Data JPA:这是jpa之上的另一层,春天提供让你的生活更轻松。
  4. 让我们了解 spring data jpa和spring + hibernate 是如何工作的 -

    Spring Data JPA:

    假设你正在为你的应用程序使用spring + hibernate。现在你需要有dao接口和实现,你将使用hibernate的SessionFactory编写crud操作。假设您正在为Employee类编写dao类,明天在您的应用程序中,您可能需要为任何其他实体编写类似的crud操作。所以我们可以在这里看到很多样板代码。

    现在,Spring数据jpa允许我们通过扩展其存储库(crudrepository,jparepository)来定义dao接口,因此它在运行时为您提供了dao实现。你不需要再写dao实现了。看看spring data jpa如何让你的生活变得轻松。

答案 2 :(得分:15)

我不同意SpringJPA使生活变得轻松。是的,它提供了一些类,您可以快速制作一些简单的DAO,但实际上,这就是您所能做的。 如果您要执行除findById()或保存以外的其他操作,则必须经历地狱:

  • org.springframework.data.repository类(这是基本的JPA类)中没有EntityManager访问权限
  • 自己的交易管理(不允许休眠交易)
  • 多个数据源配置带来的巨大问题
  • 没有数据源池(必须将HikariCP用作第三方库)

为什么自己的事务管理是不利的?由于Java 1.8允许接口中使用默认方法,因此基于Spring注释的事务无法正常工作。

不幸的是,SpringJPA基于反射,有时您需要将方法名称或实体包指向注释(!)。这就是任何重构都会导致严重崩溃的原因。 可悲的是,@ Transactional仅适用于主要DS :(因此,如果您有多个DataSource,请记住-事务仅适用于主要DS:)

  

Hibernate和Spring Data JPA之间的主要区别是什么?

Hibernate与JPA兼容,而SpringJPA与Spring兼容。当SpringJPA可以在Spring-SpringBoot中使用时,您的HibernateJPA DAO可以与JavaEE或Hibernate Standalone一起使用

  

什么时候不应该使用Hibernate或Spring Data JPA?另外,Spring JDBC模板何时能比Hibernate / Spring Data JPA更好?

仅在需要使用大量Join或需要使用具有多个数据源连接的Spring时使用Spring JDBC。通常,避免使用JPA进行加入。

但是,我的一般建议是使用全新的解决方案-Daobab(http://www.daobab.io)。 Daobab是我的Java以及任何JPA引擎集成商,我相信它将对您的工作有很大帮助:)

答案 3 :(得分:1)

Hibernate是“ JPA”的实现,它是数据库中Java对象的规范。

我建议使用w.r.t JPA,因为您可以在不同的ORMS之间切换。

使用JDBC时,您需要使用SQL查询,因此,如果您精通SQL,则可以使用JDBC。

答案 4 :(得分:1)

Spring DataJPA之上的便捷库,它抽象了很多东西,并将Spring魔术(不管喜欢与否)带到了持久性存储访问中。它主要用于处理关系数据库。简而言之,它允许您声明具有findByNameOrderByAge(String name);之类的方法的接口,这些方法将在运行时进行解析并转换为适当的JPA查询。

将其放置在JPA顶部使它具有以下用途:

  1. 不了解SQL或非常不了解的新手开发人员。这是一个 灾难的秘诀,但如果这个项目微不足道,他们可以避免。

  2. 经验丰富的工程师,他们知道自己的工作并想要完成工作 快速。这可能是一种可行的策略(但请进一步阅读)。

根据我对Spring Data的经验,它的魔力太大(通常适用于Spring)。我开始在一个项目中大量使用它,并最终遇到了几个无法解决的问题,最终导致丑陋的解决方法。后来我读了其他用户的抱怨,并意识到这些问题是Spring Data的典型问题。

我最终走低了一层,开始使用JDBI-一个不错的库,它具有足够的“魔力”可以将您从样板中解救出来。有了它,您就可以完全控制SQL查询,几乎不需要与库打架。

答案 5 :(得分:0)

如果您更喜欢简单性和对SQL查询的更多控制,建议使用Spring Data / Spring JDBC。

它在JPA中有大量的学习曲线,有时很难调试问题。 另一方面,虽然您可以完全控制SQL,但是优化查询和提高性能变得容易得多。您可以轻松地与DBA或对数据库有更好了解的人共享SQL。