我想绕过JPA,并且学到了很多东西。 JPA是一个java规范,提供者实现这个规范。我理解那部分。Spring Data(JPA)如何与JPA持久性提供程序相关联?
我不明白的是Spring Data如何进入画面。 Spring Data是否也是像Hibernate或OpenJPA这样的提供者?如果不是,那是什么? Spring Data如何“让事情变得更简单”?
我想绕过JPA,并且学到了很多东西。 JPA是一个java规范,提供者实现这个规范。我理解那部分。Spring Data(JPA)如何与JPA持久性提供程序相关联?
我不明白的是Spring Data如何进入画面。 Spring Data是否也是像Hibernate或OpenJPA这样的提供者?如果不是,那是什么? Spring Data如何“让事情变得更简单”?
将Spring Data视为一种支持JPA和许多其他持久模型的方式,并且对您自己的代码透明。 Spring Data使您可以更轻松地在统一界面中操作更多类型的数据源系统。如果没有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
),或者如果需要,甚至可以手动执行。
这里一个简单的副作用是,通过配置中的翻转开关,您可以使用相同的存储库接口将实例持久保存到MongoDB中。这并不意味着我们建议盲目地从一家商店搬到另一家商店,因为商店通常需要调整数据模型以有效地工作。不过,它允许开发人员在使用不同商店的项目之间快速切换,因为存储库的工作方式相同(通过通用API方法实现编程模型)。
春天JPA的数据实际上是实现存储库抽象加上其他一些花俏的薄层。所以我们并不是取代持久性提供者,而是通过API实际利用它们,甚至可以缓解各个JPA提供者之间的一些怪癖和差异。
详细的回应,但它并没有回答这个根本问题:“Spring Data JPA是一个提供者,还是它在JPA之上,仍然需要提供者(OpenJPA,Hibernate,EclipseLink等)?” –
你读过最后一段吗? ;) –
你在问Spring数据JPA吗? – dhamibirendra
是今年春天的数据jpa:http://projects.spring.io/spring-data-jpa/ – user1099123
Spring Data JPA只根据实体对象自动为您实现常见的JPA数据访问方法。它基于Grails对象关系映射(GORM)并使用相同的约定。自动创建的方法的名称也描述了该方法将返回的内容。如果你有一个带有属性栏的对象Foo并且想要找到某个栏的所有Foos,那么你可以调用自动创建的方法Foo.findByBar()。假设Foo有一个dateCreated属性,并且您想查找在特定时间段内创建的所有Foos,请使用Foo.findByDateCreatedBetween(firstDate,secondDate) –