【问题标题】:How does Spring Data (JPA) relate to JPA persistence providers?Spring Data (JPA) 与 JPA 持久性提供程序有何关系?
【发布时间】:2014-01-25 13:19:37
【问题描述】:

我正在尝试围绕 JPA 进行研究,并且学到了很多东西。 JPA 是一个 java 规范,提供者实现了这个规范。我理解那部分。

我不明白 Spring Data 是如何出现的。 Spring Data 也是像 Hibernate 或 OpenJPA 这样的提供者吗?如果不是,那是什么? Spring Data 如何“让事情变得更简单”?

【问题讨论】:

  • 您在询问 Spring Data JPA?
  • 是的,今年春季数据 jpa:projects.spring.io/spring-data-jpa
  • Spring Data JPA 仅基于 Entity 对象自动为您实现常见的 JPA 数据访问方法。它基于 Grails 对象关系映射 (GORM) 并使用相同的约定。自动创建的方法的名称还描述了该方法将返回的内容。如果你有一个带有属性 bar 的对象 Foo,并且想要查找某个 bar 的所有 Foo,你只需调用自动创建的方法 Foo.findByBar()。假设 Foo 有一个 dateCreated 属性,并且您想查找在某个时间范围内创建的所有 Foo,请使用 Foo.findByDateCreatedBetween(firstDate, secondDate)
  • vance,所以它是提供者?我不需要使用 OPENJPA 或 Hibernate?还是在实现这些方法时仍然需要提供者?

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


【解决方案1】:

将 Spring Data 视为一种以对您自己的代码透明的方式支持 JPA 和许多其他持久性模型的方式。 Spring Data 使您可以更轻松地在统一的界面中操作更多类型的数据源系统。如果没有 Spring Data,您将需要在代码中引入更多适配器,每次您都必须处理额外的逻辑。

【讨论】:

    【解决方案2】:

    Spring Data 项目总体上是一个总括项目,其使命宣言如下:

    …提供熟悉且一致的基于 Spring 的编程模型,同时保留特定于商店的特性和功能。

    因此,我们通常不仅通过 JPA 访问关系数据访问持久空间。这里的重要部分有两个方面:

    1. 编程模型代替通用 API
    2. 支持商店特定功能

    由于如今数据访问空间如此多样化,尝试使用一个统一的 API 访问所有商店注定要失败。您最终会得到一个隐藏商店特定部分的最小公分母 - 在您选择性地选择特定商店的时候因为它的细节。将这些抽象出来完全颠覆了这一点。在我们看来,尤其是尝试使用 JPA 是错误的,因为它与定义上的关系概念(@Table、连接、事务)紧密相关。

    不过,您不想使用完全不同的 API,也不想在使用多个 API 或从一个项目切换到另一个项目时迷失在商店差异中。 Spring 传统上通过采用一致的编程模型在这方面提供帮助,该模型具有以相同方式工作但仍特定于特定技术的抽象。例如,JDBC 和 JMS 是完全不同的技术。 Spring 提供了 JdbcTemplateJmsTemplate,它们涵盖了相同的职责(资源管理和异常转换),并且在从使用 JDBC 迁移到 JMS 时降低了学习曲线,反之亦然。

    Spring Data 通过 Spring 开发人员知道的抽象来公开特定于商店的功能,从而实现了这一点。我已经提到了模板,但它还包括通用配置机制(XML 命名空间,使用 DI 和 AOP 等)。

    存储库

    此编程模型的最顶层是存储库抽象。在其核心,它通过让您避免编写比严格必要的更多的实现代码来显着简化数据访问层的开发。它提供开箱即用的 CRUD 功能、分页以及声明式查询方法。

    假设一个Customer 域类。为其启用持久性只需声明一个存储库接口,如下所示:

    interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> {
    
      List<Customer> findByLastnameContaining(String lastname);
    }
    

    现在需要配置(和域类映射)才能创建此接口的实例并从客户端使用它。 PagingAndSortingRepository 包括基本的 CRUD 功能以及 Page&lt;Customer&gt; findAll(Pageable pageable) 之类的东西(因此可以逐页访问)。如您所见,我们还支持查询派生机制,以避免需要为简单查询编写任何实现代码。对于更复杂的,我们允许手动声明(例如在方法上使用@Query),甚至在必要时手动实现。

    这里有个简洁的副作用是,通过配置中的翻转开关,您可以使用相同的存储库接口将 Customer 实例持久化到 MongoDB 中。这并不意味着我们建议盲目地从一家商店转移到另一家商店,因为商店通常需要调整数据模型以高效工作。然而,它允许开发人员在使用不同商店的项目之间快速切换,因为存储库的工作方式相同(通过通用 API 方法实现编程模型)。

    JPA 细节

    Spring Data JPA 实际上是一个实现存储库抽象的薄层以及一些其他的花里胡哨。因此,我们并没有替换持久性提供程序,而是通过 API 实际利用它们,甚至减少了各个 JPA 提供程序之间的一些怪癖和差异。

    【讨论】:

    • 详细的响应,但它没有回答基本问题“Spring Data JPA 是提供者,还是 JPA 之上的层仍需要提供者(OpenJPA、Hibernate、EclipseLink 等)在下面? "
    • 这个答案太长,不具体。
    【解决方案3】:

    spring-data JPA 不是 JPA 提供者。它是一个库/框架,在我们的 JPA 提供程序(Hibernate/TopLink)之上添加了一个额外的抽象层。如果您在项目中使用 Spring Data,则不会编写大多数低级数据访问操作,例如编写 SQL 查询、DAO 类等。

    但是你必须有一个 JPA-Provider(Hibernate、Toplink 等)来实现 spring-data-jpa。

    【讨论】:

      猜你喜欢
      • 2013-09-30
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多