JPA和Hibernate究竟是什么关系???

(文章借用了其余几篇博客中的内容,由于是初学者,许多概念性的关系本身不能彻底理解,就将大神的搬了过来,若有不当,可留言,本人自会妥善处理,谢谢)sql

在学习框架的过程当中,发现学的东西不少,可是感受他们之间的联系区别都不是很了解,知道JPA能够去实现持久化数据到数据库当中,Hibernate也有这样的功能,总觉得他们之间是一种平级的关系,拥有一样的做用,是一种能够相互替代的关系,就像你吃饭时,选择吃米饭和吃面条同样,然而,在进行了一番搜索以后,发现并非那么回事儿。数据库

JPA自己是一种规范,它的本质是一种ORM规范(不是ORM框架,由于JPA并未提供ORM实现,只是制定了规范)由于JPA是一种规范,因此,只是提供了一些相关的接口,可是接口并不能直接使用,JPA底层须要某种JPA实现,JPA如今就是Hibernate功能的一个子集session

Hibernate 从3.2开始,就开始兼容JPA。Hibernate3.2得到了Sun TCK的 JPA(Java  Persistence API) 兼容认证。JPA和Hibernate之间的关系,能够简单的理解为JPA是标准接口,Hibernate是实现,并非对标关系,借用下图能够看清楚他们之间的关系,Hibernate属于遵循JPA规范的一种实现,可是JPA是Hibernate遵循的规范之一,Hibernate还有其余实现的规范因此它们的关系更像是JPA是一种作面条的规范,而Hibernate是一种遵循作面条的规范的汤面,他不只遵循了作面条的规范,同时也会遵循作汤和调料的其余规范,他们之间并非吃面条和吃米饭的关系框架

1.JPAide

  JPA全称: Java Persistence API,JPA经过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
  JPA的出现有两个缘由:
  其一,简化现有Java EE和Java SE应用的对象持久化的开发工做;
  其二,Sun但愿整合对ORM技术,实现持久化领域的统一。学习

 Sun之因此提出JPA规范,其目的是以官方身份来统一各类ORM框架的规范,包括著名的Hibernate、TopLink等
 不过JPA规范给开发者带来了福音:开发者面向JPA规范的接口,但底层的JPA实现能够任意切换:以为Hibernate好的,能够选择Hibernate JPA实现;以为TopLink好的,能够选择TopLink JPA实现……这样开发者能够避免为使用Hibernate学习一套ORM框架,为使用TopLink又要再学习一套ORM框架

  JPA提供的技术:
  (1)ORM映射元数据
  JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持
  久化到数据库表中;
  (2)JPA 的API
  用来操做实体对象,执行CRUD操做,框架在后台替咱们完成全部的事情,开发者从繁琐的JDBC和SQL代码中解
  脱出来。
  (3)查询语言
  经过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合spa

2. Hibernatehibernate

  JPA是须要Provider来实现其功能的,Hibernate就是JPA Provider中很强的一个。3d

  例如: 对象

  (1)实体对象的状态,在Hibernate有自由、持久、游离三种,JPA里有new,managed,detached,removed,而这些状态都是一一对应的。

  (2)flush方法,都是对应的,

  (3)Query query = manager.createQuery(sql),它在Hibernate里写法上是session,而在JPA中变成了  manager

3.  JPA和Hibernate之间的关系,能够简单的理解为JPA是标准接口,Hibernate是实现。

  那么Hibernate是如何实现与JPA 的这种关系的呢?

  Hibernate主要是经过三个组件来实现的,及hibernate-annotation、hibernate-entitymanager和hibernate-core。

  (1)hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及  Hibernate自身特殊功能的annotation。

  (2)hibernate-core是Hibernate的核心实现,提供了Hibernate全部的核心功能。

  (3)hibernate-entitymanager实现了标准的JPA,能够把它当作hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。

  总的来讲,JPA是规范,Hibernate是框架,JPA是持久化规范,而Hibernate实现了JPA。

题外的一些思考:若是抛开JPA直接使用Hibernate的注解来定义一个实例,很快发现了几个问题:

  1. jpa中有Entity, Table,hibernate中也有,可是内容不一样
  2. jpa中有Column,OneToMany等,Hibernate中没有,也没有替代品

          hibernate对jpa的支持,不是另提供了一套专用于jpa的注解。一些重要的注解如Column, OneToMany等,hibernate没有提供,这说明jpa的注解已是hibernate 的核心,hibernate只提供了一些补充,而不是两套注解。要是这样,hibernate对jpa的支持还真够足量,咱们要使用hibernate注解就一定要使用jpa。

两个额外的问题

第一个是问若是想用hibernate注解,是否是必定会用到jpa的。网友的回答:“是。若是hibernate认为jpa的注解够用,就直接用。不然会弄一个本身的出来做为补充”

第二个是问,jpa和hibernate都提供了Entity,咱们应该用哪一个,仍是说能够两个一块儿用?网友回答说“Hibernate的Entity是继承了jpa的,因此若是以为jpa的不够用,直接使用hibernate的便可”