我正试图围绕JPA并且已经学到了很多东西。 JPA是一个Java规范,提供程序实现此规范。我明白那一部分。
我不明白Spring Data是如何进入图片的。 Spring Data也是像Hibernate或OpenJPA这样的提供商吗?如果没有,那是什么? Spring Data如何“让事情变得更轻松”?
答案 0 :(得分:11)
一般来说,Spring Data项目是一个总体项目,其任务声明如下:
...提供熟悉且一致的基于Spring的编程模型,同时保留特定于商店的特性和功能。
因此,我们通常不仅通过JPA接近关系数据访问持久性空间。这里重要的部分是双重的:
由于数据访问空间如此多样化,尝试使用单个统一API来处理所有商店注定要失败。您最终会得到一个隐藏商店特定部分的最小公分母 - 在您有选择地选择特定商店的时候,因为它的具体细节。抽象那些完全颠覆了这一点。特别是在我们看来,尝试使用JPA是错误的,因为它根据定义与关系概念(@Table
,连接,事务)密切相关。
尽管如此,您不希望使用完全不同的API,如果您使用多个API或从一个项目切换到另一个项目,不要在商店差异中丢失。 Spring通过采用一致的编程模型传统上在这方面提供了帮助,该模型具有以相同方式工作但仍特定于特定技术的抽象。例如,JDBC和JMS是完全不同的技术。 Spring提供了JdbcTemplate
和JmsTemplate
,它们涵盖了相同的职责(资源管理和异常转换),并且在从使用JDBC转向JMS时降低了学习曲线,反之亦然。
Spring Data通过Spring开发人员所知的抽象公开特定于商店的功能来解决这个问题。我已经提到了模板,但它还包括一般配置机制(XML命名空间,使用DI和AOP等)。
此编程模型的最顶层是存储库抽象。在其核心,它通过让您避免编写比严格必要的更多实现代码,显着简化了数据访问层的开发。它提供开箱即用的CRUD功能,分页以及声明性查询方法。
假设Customer
域类。为它启用持久性只需要声明这样的存储库接口:
interface CustomerRepository extends PagingAndSortingRepository<Customer, Long> {
List<Customer> findByLastnameContaining(String lastname);
}
现在,配置(和域类映射)能够创建此接口的实例并从客户端使用它。 PagingAndSortingRepository
包括基本的CRUD功能以及Page<Customer> findAll(Pageable pageable)
之类的内容(因此逐页访问)。如您所见,我们还支持查询派生机制,以避免需要为简单查询编写任何实现代码。对于更复杂的,我们允许手动声明(例如在方法上使用@Query
),甚至在必要时使用手动实现。
这里一个很好的副作用是,通过配置中的flip-switch,您可以使用相同的存储库接口将Customer
实例持久保存到MongoDB中。这并不意味着我们建议盲目地从一个商店转移到另一个商店,因为商店通常要求数据模型适应高效工作。但是,它允许开发人员在使用不同商店的项目之间快速切换,因为存储库只是以相同的方式工作(通过常见的API方法实现编程模型)。
Spring Data JPA实际上是一个实现存储库抽象的薄层以及其他一些花哨的东西。因此,我们不会替换持久性提供程序,而是通过API实际利用它们,甚至可以减轻个别JPA提供程序之间的一些怪癖和差异。
答案 1 :(得分:2)
将Spring Data视为一种以对您自己的代码透明的方式支持JPA和许多其他持久性模型的方法。 Spring Data使您可以更轻松地在统一界面中操作更多类型的数据源系统。如果没有Spring Data,您需要在代码中引入更多适配器,每次都需要处理额外的逻辑。
答案 2 :(得分:1)
spring-data JPA
不是JPA提供商。它是一个库/框架,在我们的JPA提供程序(Hibernate / TopLink)的顶部添加了一个额外的抽象层。如果在项目中使用Spring Data,则不会编写大多数低级数据访问操作,如编写SQL查询,DAO类等。
但是你必须有一个JPA-Provider(Hibernate,Toplink等)来实现spring-data-jpa。