我正在尝试理解JPA,并且已经学到了很多。JPA是一种java规范,供应商实现了该规范。我明白这一点。
我不明白的是Spring数据是如何出现在图片中的。Spring Data也是像Hibernate或OpenJPA一样的提供者吗?如果不是,那是什么?Spring数据如何“让事情变得更简单”?
发布于 2014-01-08 17:35:22
一般来说,Spring Data项目是一个具有以下任务声明的总括项目:
…提供熟悉且一致的基于Spring的编程模型,同时保留特定于商店的特性和功能。
因此,我们通常不只是通过JPA访问关系数据,而是处理持久性空间。这里重要的一点是两个方面:
由于如今的数据访问空间是如此的多样化,试图用一个统一的API来访问所有的商店注定会失败。你最终会得到一个最不常见的东西,它隐藏了商店的特定部分-在你有选择地选择一个特定商店的时候,因为它的特殊性。将这些抽象出来完全颠覆了这一点。特别是在我们看来,试图使用JPA是错误的,因为它与关系概念(@Table
、joins、transactions)有很深的联系。
尽管如此,你不会想要使用完全不同的API,如果你使用多个API或从一个项目切换到另一个项目,也不想迷失在商店差异中。Spring传统上通过采用一致的编程模型在这方面提供了帮助,该模型的特征是工作方式相同但仍然特定于特定技术的抽象。例如,JDBC和JMS是完全不同的技术。Spring既提供了JdbcTemplate
,也提供了涵盖相同职责(资源管理和异常转换)的JmsTemplate
,并在从使用JDBC到JMS或从使用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
),甚至在必要时手动实现。
这里的一个巧妙的副作用是,通过在配置中进行切换,您可以使用相同的存储库接口将Customer
实例持久化到MongoDB中。这并不意味着我们建议盲目地从一个商店移动到另一个商店,因为商店通常需要调整数据模型以有效地工作。然而,它允许开发人员在使用不同商店的项目之间快速切换,因为存储库以相同的方式工作(通过公共API方法实现编程模型)。
JPA细节
Spring Data JPA实际上是一个实现存储库抽象的薄层,外加一些其他花哨的功能。因此,我们不会替换持久性提供程序,而是通过API实际利用它们,甚至减轻了各个JPA提供程序之间的一些怪癖和差异。
发布于 2014-01-07 18:20:08
可以将Spring数据看作一种支持JPA和许多其他持久性模型的方式,这种方式对您自己的代码是透明的。Spring Data使您可以更轻松地在统一界面中操作更多类型的数据源系统。如果没有Spring Data,您将需要在代码中引入更多适配器,每次您都必须处理额外的逻辑。
发布于 2018-03-14 21:23:13
spring-data JPA
不是一个JPA提供者。它是一个库/框架,在我们的JPA提供者(Hibernate/TopLink)的顶部添加了一个额外的抽象层。如果您在项目中使用Spring Data,则不会编写大多数低级数据访问操作,如编写SQL查询、DAO类等。
但是您必须有一个jpa提供程序(Hibernate、Toplink等)来实现spring-data-jpa。
https://stackoverflow.com/questions/20978739
复制