gpt4 book ai didi

java - Spring Data (JPA) 与 JPA 持久性提供程序有何关系?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:35:45 24 4
gpt4 key购买 nike

我正在努力研究 JPA,并且学到了很多东西。 JPA 是一个 Java 规范,提供者实现了这个规范。我明白那部分。

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

最佳答案

Spring Data 项目通常是一个伞状项目,具有以下使命声明:

… provide a familiar and consistent Spring-based programming model while retaining store-specific features and capabilities.

因此,我们不仅通过 JPA 进行关系数据访问,而且在一般情况下我们处理持久性空间。这里的重要部分有两方面:

  1. 编程模型而不是通用 API
  2. 支持商店特定功能

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

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

Spring Data 通过 Spring 开发人员知道的抽象来公开特定于商店的功能,以此来接受这一点。我已经提到了模板,但它还包括通用配置机制(XML namespace 、使用 DI 和 AOP 等)。

存储库

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

假设 Customer域类。为它启用持久性只是声明一个像这样的存储库接口(interface)的问题:

interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> {

List<Customer> findByLastnameContaining(String lastname);
}

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

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

JPA 细节

Spring Data JPA 实际上是一个薄层,实现了存储库抽象以及一些其他功能。因此,我们不是要替换持久性提供程序,而是实际上通过 API 来利用它们,甚至可以减轻各个 JPA 提供程序之间的一些怪癖和差异。

关于java - Spring Data (JPA) 与 JPA 持久性提供程序有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20978739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com