JPA是一种规范,而hibernate是JPA的一种实现html
JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸收了目前Java持久化技术的优势,旨在规范、简化Java对象的持久化工做。使用JPA持久化对象,并非依赖于某一个ORM框架。java
JPA是目前比较流行的一种ORM技术之一,因此他拥有ORM技术的各类特色,固然他还有本身的一些优点:程序员
1 标准化sql
JPA 是 JCP 组织发布的 Java EE 标准之一,所以任何声称符合 JPA 标准的框架都遵循一样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用可以通过少许的修改就可以在不一样的JPA框架下运行。数据库
2 对容器级特性的支持编程
JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的做用。设计模式
3 简单易用,集成方便架构
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下建立实体和建立Java 类同样简单,没有任何的约束和限制,只须要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都很是简单,没有太多特别的规则和设计模式的要求,开发者能够很容易的掌握。JPA基于非侵入式原则设计,所以能够很容易的和其它框架或者容器集成。并发
4 可媲美JDBC的查询能力oracle
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的天然语法构造查询语句,能够当作是hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操做对象是实体,而不是关系数据库的表,并且可以支持批量更新和修改、JOIN、GROUP BY、HAVING 等一般只有 SQL 才可以提供的高级查询特性,甚至还可以支持子查询。
5 支持面向对象的高级特性
JPA 中可以支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持可以让开发者最大限度的使用面向对象的模型设计企业应用,而不须要自行处理这些特性在关系数据库的持久化。
实例中使用的注释列表以下。
注解 |
描述 |
@Entity |
声明类为实体或表。 |
@Table |
声明表名。 |
@Basic |
指定非约束明确的各个字段。 |
@Embedded |
指定类或它的值是一个可嵌入的类的实例的实体的属性。 |
@Id |
指定的类的属性,用于识别(一个表中的主键)。 |
@GeneratedValue |
指定如何标识属性能够被初始化,例如自动,手动,或从序列表中得到的值。 |
@Transient |
指定的属性,它是不持久的,即,该值永远不会存储在数据库中。 |
@Column |
指定持久属性栏属性。 |
@SequenceGenerator |
指定在@GeneratedValue注解中指定的属性的值。它建立了一个序列。 |
@TableGenerator |
指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。 |
@AccessType |
这种类型的注释用于设置访问类型。若是设置@AccessType(FIELD),而后进入FIELD明智的。若是设置@AccessType(PROPERTY),而后进入属性发生明智的。 |
@JoinColumn |
指定一个实体组织或实体的集合。这是用在多对一和一对多关联。 |
@UniqueConstraint |
指定的字段和用于主要或辅助表的惟一约束。 |
@ColumnResult |
参考使用select子句的SQL查询中的列名。 |
@ManyToMany |
定义了链接表之间的多对多一对多的关系。 |
@ManyToOne |
定义了链接表之间的多对一的关系。 |
@OneToMany |
定义了链接表之间存在一个一对多的关系。 |
@OneToOne |
定义了链接表之间有一个一对一的关系。 |
@NamedQueries |
指定命名查询的列表。 |
@NamedQuery |
指定使用静态名称的查询。 |
JPA基础教程:
JPA和hibernate关系
一些重要的注解如Column, OneToMany等,hibernate没有提供,这说明jpa的注解已是hibernate的核心,hibernate只提供了一些补充,而不是两 套注解。曾经看过两个很经典的问题,
第一个是问若是想用hibernate注解,是否是必定会用到jpa的。网友的回答:“是。若是hibernate认为jpa的注解够用,就直接用。不然会弄一个本身的出来做为补充”
第二个是问,jpa和hibernate都提供了Entity,咱们应该用哪一个,仍是说能够两个一块儿用?网友回答说“Hibernate的Entity是继承了jpa的,因此若是以为jpa的不够用,直接使用hibernate的便可”。
EJB:
http://www.yiibai.com/html/ejb
在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。在EJB3.0推出之后,实体Bean被单独分了出来,造成了新的规范JPA
JPA和EJB关系:
简单的说,JPA虽然出自EJB3,可是其使用的范围却大于EJB3,不只能够在JavaEE5中,也能够在JavaSE的环境中,如图所示EJB3和JPA的关系.
JDBC:
Java语言访问数据库的一种规范,是一套API。JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序能够访问各类不一样类型的数据库。
为了使客户端程序独立于特定的数据库驱动程序,JDBC规范建议开发者使用基于接口的编程方式,即尽可能使应用仅依赖java.sql及javax.sql中的接口和类。
ORM:
ORM 是Object-Relation-Mapping,即对象关系影射技术,是对象持久化的核心。ORM是对JDBC的封装,从而解决了JDBC的各类存在问题:
a) 繁琐的代码问题
用JDBC的API编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错。例如:PreparedStatement pstmt=con.prepareStatment("insert into account value(?,?,?,?,?,?,?,?,?)");
ORM则创建了Java对象与数据库对象之间的影射关系,程序员不须要编写复杂的SQL语句,直接操做Java对象便可,从而大大下降了代码量,也使程序员更加专一于业务逻辑的实现。
b) 数据库对象链接问题
关系数据对象之间,存在各类关系,包括1对1、1对多、多对1、多对多、级联等。在数据库对象更新的时候,采用JDBC编程,必须十分当心处理这些关系,以保证维持这些关系不会出现错误,而这个过程是一个很费时费力的过程。
ORM创建Java对象与数据库对象关系影射的同时,也自动根据数据库对象之间的关系建立Java对象的关系,而且提供了维持这些关系完整、有效的机制。
c) 系统架构问题
JDBC属于数据访问层,可是使用JDBC编程时,必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、建立了什么索引等等与后台数据库相关的详细信息。
使用ORM技术,能够将数据库层彻底隐蔽,呈献给程序员的只有Java的对象,程序员只须要根据业务逻辑的须要调用Java对象的Getter和 Setter方法,便可实现对后台数据库的操做,程序员没必要知道后台采用什么数据库、有哪些表、有什么字段、表与表之间有什么关系。
d) 性能问题
采用JDBC编程,在不少时候存在效率低下的问题。
pstmt =conn.prepareStatement("insert into user_info values(?,?)");
for (int i=0; i<1000; i++) {
pstmt.setInt(1,i);
pstmt.setString(2,"User"+i.toString());
pstmt.executeUpdate();
}
以上程序将向后台数据库发送1000次SQL语句执行请求,运行效率较低。
采用ORM技术,ORM框架将根据具体数据库操做须要,会自动延迟向后台数据库发送SQL请求,ORM也能够根据实际状况,将数据库访问操做合成,尽可能减小没必要要的数据库操做请求。
ORM框架:
目前ORM框架的产品很是之多,除了个大公司、组织的产品外,其余一些小团队也在推出本身的ORM框架。目前流行的ORM框架有以下这些产品:
(1)Enitiy EJB:Enitiy EJB实际上也是一种ORM技术,这是一直备受争议的组件技术。事实上,EJB为Java EE的蓬勃发展赢得了极高的声誉,EJB做为一种重量级、高花费的ORM技术具备不可比拟的优点。就其余架构设计来说,依然很是优秀。即便如今十分流行的轻量级Java EE架构,其实质是对经典Java EE架构的模仿——虽然存在些许的改进。EJB3.1也采起了低侵入式的设计,增长了Annotation,也具备极大的吸引力。
(2)hibernate:目前最流行的开源ORM框架,已经被选做JBoss的持久层解决方案。整个HIbernate项目也一并投入了Jboss的怀抱,而JBoss又加入了RedHat组织,因此如今Hibernate属于RedHat 的一部分。Hibernate 灵巧的设计、优秀的性能,还有其丰富的文档都是其风靡全球的重要因素。
(3)iBatis: Apache软件基金组织的子项目。与其称它为一种ORM框架,不如称它为一中“SQL Mapping”框架。曾经在J2EE的开发中扮演很是重要的角色,但由于不支持存粹的面向对象操做,所以如今逐渐地被取代。可是在一些公司,依然占有一席之地,特别是一些对数据访问特别灵活的地方,iBatis更加的灵活,它容许开发人员直接编写SQL语句。
(4)TopLink:Oracle公司的产品,做为一个遵循OTN协议的商业产品,TopLink 在开发过程当中能够自由地下载和使用,可是一旦做为商业产品被使用,则须要收取费用。因为这一点,TopLink 的市场占有率不高。
(5)OBJ:Apache软件基金组织的子项目。另外一个开源的ORM框架,能够说是Apache做为iBatis以后的取代产品,也是很是优秀的O/R Mapping框架,可是因为Hibernate 的广芒太盛,因此并未有普遍的使用,并且因为OJB的开发文档不是不少,这也影响了OJB的流行。