JPA规范本质上就是一种ORM规范,注意不是ORM框架——由于JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现,JBoss应用服务器底层就以Hibernate做为JPA的实现。java
既然JPA做为一种规范——也就说JPA规范中提供的只是一些接口,显然接口不能直接拿来使用。虽然应用程序能够面向接口编程,但JPA底层必定须要某种JPA实现,不然JPA依然没法使用。spring
从笔者的视角来看,Sun之因此提出JPA规范,其目的是以官方的身份来统一各类ORM框架的规范,包括著名的Hibernate、TopLink等。不过JPA规范给开发者带来了福音:开发者面向JPA规范的接口,但底层的JPA实现能够任意切换:以为Hibernate好的,能够选择Hibernate JPA实现;以为TopLink好的,能够选择TopLink JPA实现……这样开发者能够避免为使用Hibernate学习一套ORM框架,为使用TopLink又要再学习一套ORM框架。数据库
下图是JPA和Hibernate、TopLink等ORM框架之间的关系:编程
JPA规范与ORM框架之间的关系缓存
JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了做为ORM框架以外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC能够驱动JDBC驱动吗?服务器
实现应用程序的数据访问层已经很麻烦了好一阵子。太多的样板代码必须被写入。Domain classes,并无被设计成面向一个真正的对象或领域驱动的方式。框架
使用spring data jpa可以使丰富的Domain classes的持久性开发变得轻松不少,即便样板代码来实现存储库量特别仍是至关高的。因此Spring data jpa的目标是简化关于各类持久存储数据访问层而努力。ide
备注:Domain classes 指的是POJO类,例如数据库中有一张表:Student,那么咱们会在程序中定义与之对应的Student.java,而这个Student.java就是属于Domain classes。学习
Long story short, then, Spring Data JPA provides a definition to implement repositories that is supported under the hood by referencing the JPA specification, using the provider you define.spa
长话短说,Spring Data JPA 是在JPA规范的基础下提供了Repository层的实现,可是使用那一款ORM须要你本身去决定。
个人理解是:虽然ORM框架都实现了JPA规范,可是在不一样ORM框架之间切换是须要编写的代码有一些差别,而经过使用Spring Data Jpa可以方便你们在不一样的ORM框架中间进行切换而不要更改代码。而且Spring Data Jpa对Repository层封装的很好,能够省去很多的麻烦。
spring data jpa、jpa以及ORM框架之间的关系
实现JPA接口也并不意味着能够替代Hibernate,Hibernate的索引功能,缓存功能并无相应的接口,因此有些时候仍是须要Hibernate的。可是!凡是JPA能实现的功能都用JPA来实现,以此来减小框架之间的耦合性。