J2EE规范制订了EntityBean规范来解决应用程序的持久化问题,但由于设计得过于复杂等缺陷,因此在EJB规范中饱受诟病。
随后,大量开源ORM框架(如Hibernate)出现。这些ORM框架不仅简单、易用,而且也可以面向对象的方式来操作关系数据库,并提供强大的数据查询功能。慢慢地,这些ORM框架不断替代EntityBean。
当Sun公司制订JavaEE5规范时,Sun公司彻底抛弃了原来的EntityBean,而是推出了新的JPA规范·Sun公司的JPA以Entity为核心,它将实体映射到底层数据表,然后通过在应用程序中使用JPA的EntityManager来操作Entity,而JPA实现则会将这种操作转换为对底层数据表的操作。
需要注意的一点是:JPA只是一种规范!并不是任何具体的ORM框架!当在程序中使用JPA进行持久化时,底层一定需要具体的ORM框架作为实现。
EJB3的实体(Entity)是充分吸收ORM(Object/RelationMapping)思想之后的产物。
常见的ORM框架,如:EntityEJB、Hibernate、IBATIS、TopLink、OJB
(一)对象关系数据库映射(ORM)
ORM的全称是Object/RelationMapping,对象/关系数据库映射·ORM可理解成一种规范,它概述了这类框架的基本特征,完成面向对象的编程语言到关系数据库的映射。当ORM框架完成映射后,既可利用面向对象程序设计语言的简单易用性,又可利用关系数据库的技术优势。因此,我们可把ORM框架当成应用程序和数据库的桥梁。
当我们使用一种面向对象的程序设计语言来进行应用开发时。从项目开始起一直采用的是面向对象分析、面向对象设计、面向对象编程,但到了持久层数据库访问时,又必须重返关系数据库的访问方式·这是一种非常糟糕的感觉。于是我们需要一种工具,它可以把关系数据库包装成面向对象的模型。这个工具就是ORM框架。
随着面向对象思想的发展,又出现了面向对象数据库(不作为本文重点)
面向对象的程序设计语言的优势:
- 面向对象的建模、操作
- 多态、继承。
- 摈弃难以理解的过程。
- 简单易用,易理解。
关系数据库系统较之面向对象语言的优势,比如:
- 大量数据查找、排序。
- 集合数据连接操作、映射
- 数据库访问的并发、事务
- 数据库的约束、隔离
面对这种面向对象语言与关系数据库系统并存的局面,采用ORM就变成一种必然。
JPA实现的作用就是:把对实体的操作,转换成对数据库的操作。这样应用程序就能以面向对的方式操作实体,而JPA实现则负责转换成对应的SQL(结构化查询语言)操作。
JPA规范本质上就是一种ORM规范,注意,不是ORM框架。因为JPA并未提供ORM实现。它只是制订了一些规范,提供了一些编程的API接口,但真体实现则由应用服务器厂商来提供实现。JBOSS应用服务器底层就以Himate作为JPA实现
开发者面向JPA规范的接口,但底层的JPA实现可以任意切换。
(二)JPA映射规则
- 数据表映射实体类。
- 当使用这个实体类来创建实例,修改属性,删除实体时,系统会自动转化为对这个表进行CRUD操作
- 数据表的行映射实体对象
- 数据表的列(字段)映射实体的属性
基于这种基本的映射方式,JPA规范就完成对象模型和关系模型之间的相互映射。由此可见,在JPA规范中,实体只是一种中间媒介,应用程序只需操作实体对象,ORM框架则负责将这种操作转化为对底层数据库的操作。
(这种转化对开发者透明,开发者无须关心!从而使得开发者从关系型数据库模式中解脱出来,以面向对象的思维操作关系型数据库。)
(三)JPA规范简介
JPA规范并不属于以EJB规范,它是一套完全独立的规范。
JPA不仅可以在基于以EJB的JavaEE应用程序中使用,而且完全可以在普通JavaSE应用程序中使用。
在JPA操作过程中,最常用的3种组件如下:
(1)实体
就是一个普通的POJO,只是为它增加了orm.xml映射文件或Annotation。
目的:建立实体和底层数据表之间的对应关系。
(2)EntityManager
实体只是和底层数据表具有映射关系的POJO,它本身并没有任何持久化能力,只有使用EntityManager来对实体进行操作时,JPA规范才可将这种操作转换为对底层数据库的操作。JPA规范的EntityManager的作用有点类似于Hibernate框架的Session。
与Hibernate中session类似的是,当程序需要使用JPA添加、删除、更新实体时,应用程序都需要使用EntityManager这个接口来完成·除此之外,如果应用程序需要检索实体,则通过EntityManager根据JPQL创建Query对象来实现。
(3)JPQL查询
类似于Hibernate提供的HQL查询语言,JPA提供了JPQL查询语言。
这种查询语言非简单、易用,可以非常方便地检索己保存的实体·JPA提供了一个Query接口来执行查询,EntityManager根据己有的JPQL来创建Query对象,然后由Query对象来执行查询。
总结:
JPA实现的作用就是:把对实体的操作,转换成对数据库的操作。这样应用程序就能以面向对的方式操作实体,而JPA实现则负责转换成对应的SQL(结构化查询语言)操作。
JPA只是一种规范!并不是任何具体的ORM框架!当在程序中使用JPA进行持久化时,底层一定需要具体的ORM框架作为实现。