(文章借用了其余几篇博客中的内容,由于是初学者,许多概念性的关系本身不能彻底理解,就将大神的搬了过来,若有不当,可留言,本人自会妥善处理,谢谢)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技术,实现持久化领域的统一。学习
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的注解来定义一个实例,很快发现了几个问题:
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的便可”