2014-01-07 54 views
6

我想绕过JPA,并且学到了很多东西。 JPA是一个java规范,提供者实现这个规范。我理解那部分。Spring Data(JPA)如何与JPA持久性提供程序相关联?

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

+0

你在问Spring数据JPA吗? – dhamibirendra

+0

是今年春天的数据jpa:http://projects.spring.io/spring-data-jpa/ – user1099123

+0

Spring Data JPA只根据实体对象自动为您实现常见的JPA数据访问方法。它基于Grails对象关系映射(GORM)并使用相同的约定。自动创建的方法的名称也描述了该方法将返回的内容。如果你有一个带有属性栏的对象Foo并且想要找到某个栏的所有Foos,那么你可以调用自动创建的方法Foo.findByBar()。假设Foo有一个dateCreated属性,并且您想查找在特定时间段内创建的所有Foos,请使用Foo.findByDateCreatedBetween(firstDate,secondDate) –

回答

2

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

12

春天数据项目是一个综合项目,其主旨发言:

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

因此,我们通常接近持久空间,而不仅仅是通过JPA进行关系数据访问。这里最重要的部分是双重的:

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

由于数据访问的空间是如此的不同,这些天,试图接近所有的具有单一统一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),或者如果需要,甚至可以手动执行。

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

JPA细节

春天JPA的数据实际上是实现存储库抽象加上其他一些花俏的薄层。所以我们并不是取代持久性提供者,而是通过API实际利用它们,甚至可以缓解各个JPA提供者之间的一些怪癖和差异。

+0

详细的回应,但它并没有回答这个根本问题:“Spring Data JPA是一个提供者,还是它在JPA之上,仍然需要提供者(OpenJPA,Hibernate,EclipseLink等)?” –

+1

你读过最后一段吗? ;) –

相关问题