1 JPA
1.1 JPA是什么
JPA全称Java Persistence API,是一组用于将数据存入数据库的类和方法的集合。JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
1.2 JPA 的出现
Sun公司为了简化现有Java EE和Java SE应用的对象持久化的开发工作,整合ORM技术,结束现在Hibernate、iBATIS、TopLink等ORM框架各自为营的局面,提出了新的JPA ORM规范。
1)JPA为POJO提供持久化标准规范。
2)JPA的使用:
JPA是开源API,各企业经营商Oracle, Redhat, Eclipse等,提供各种有特色的JPA产品,其中包括: Hiberate, Eclipselink, Toplink, Spring Data JPA等等
3)JPA主要技术:
JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。总的来说,JPA包括以下三方面的技术:
A.ORM映射元数据:JPA通过注解或XML描述映射关系,并将运行中的实体对象持久化到数据库中。
B.JPA持久化API:使用面向对象的思想,操作实体对象,进行增删改查的操作。至于怎么操作,由框架思考这件事。这必将大大的节省了开发时间,提高了开发效率。
C.查询语言:使用面向对象的思想避免了同程序的SQL语句产生交集。
1.3 JPA架构
JPA展示如何将Plain Oriented Java Object(POJO)定义为entity,以及如何管理entity之间的关系。
类级架构
JPA的类级架构包含几个核心组件
EntityManagerFactory: 创建和管理多个EntityManager实例
EntityManager: 接口,管理对象的操作(create, update, delete, Query)
Entity: 持久化对象,在数据库中以record存储
EntityTransaction: 与EntityManager一对一
Persistence: 包含获取EntityManagerFactory实例的静态方法
Query: 运营商必须实现的接口,获取满足creteria的关系对象(relational object)
1.4 JPA与Hibernate
注意,前面说过了,JPA是统一了各种ORM框架的接口,所以说,可以把JPA理解为它并不是新的ORM框架,是接口,是规范,是工具。就像JDBC不是数据库一样,也没有办法代替数据库。同理,JPA也不是ORM框架,我们可以透过JPA使用各种ORM,实现各项目之间的移植性,这是做到低耦合、可扩展的程序设计。
Hibernate是ORM框架,它实现了JPA的规范。
实现JPA接口也并不意味着可以替代Hibernate,Hibernate的索引功能,缓存功能并没有相应的接口,所以有些时候还是需要Hibernate的。但是!凡是JPA能实现的功能都用JPA来实现,以此来减少框架之间的耦合性。
2 Hibernate ORM
2.1 什么是orm
ORM的全称是Object Relational Mapping,即对象关系映射。它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
2.2 什么是hibernate
对于Hibernate的称呼有很多,比如工具、技术、框架以及解决方案等,这些都可以,重要的是大家要知道它的作用。在这里我习惯性称它为框架,它是一种能实现ORM的框架。能实现ORM这个功能的框架有很多,Hibernate可以说是这些框架中最流行、最受开发者关注的,甚至连JBoss公司也把它吸收进来,利用它在自己的项目中实现ORM功能。
2.3 hibernate ORM
在使用Hibernate实现ORM功能的时候,主要的文件有:映射类(.java)、映射文件(.hbm.xml)以及数据库配置文件(.properties或.cfg.xml),它们各自的作用如下:
⑴映射类:它的作用是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象。
⑵映射文件:它的作用是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。
⑶数据库配置文件:它的作用是指定与数据库连接时需要的连接信息,比如连接哪中数据库、登录用户名、登录密码以及连接字符串等。
2.4 hibernate 实现流程
从上图中,我们可以看出Hibernate六大核心接口,两个主要配置文件,以及他们直接的关系。Hibernate的所有内容都在这了。那我们根据这张图认识一下整个流程。
-
1、Configuration接口:通过Configuration().configure()读取并解析hibernate.cfg.xml配置文件,并启动Hibernate
由hibernate.cfg.xml中的< mapping resource=”com/xx/User.hbm.xml”/>读取并解析映射信息 -
2、SessionFactory接口:负责初始化Hibernate(通过config.buildSessionFactory(); //创建SessionFactory)
-
3、Session接口:负责持久化对象的CRUD操作(sessionFactory.openSession(); //打开Sesssion)
-
4、Transaction接口:负责事务(session.beginTransaction(); //创建事务Transation,session.getTransaction().commit(); //提交事务)
-
5、Query接口和Criteria接口:负责执行各种数据库查询(持久化操作)
最后需要:关闭Session,关闭SesstionFactory
注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。
2.5 缺点
总的来说,hibernate的缺点主要有以下几点:
- 由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高。要使用数据库的特定优化机制的时候,不适合用Hibernate
- 框架中使用ORM原则,导致配置过于复杂,一旦遇到大型项目,比如300张表以上,配置文件和内容是非常庞大的,另外,DTO满天飞,性能和维护问题随之而来
- 如果项目中各个表中关系复杂,表之间的关系很多,在很多地方把lazy都设置false,会导致数据查询和加载很慢,尤其是级联查询的时候。
- Hibernate在批量数据处理时有弱势,对于批量的修改,删除,不适合用Hibernate,这也是ORM框架的弱点
- Hibernate是ORM框架(object-relation maping对象关系映射),它是用来实现JDBC的功能,但是它不能替换JDBC,它是在JDBC基础上实现的,即Hibernate中已经把JDBC封装了,最终的代码是到HIbernate在传递到JDBC在于数据库交换,所以性能没有JDBC直接与数据库交互快。
网友评论
=。= 想学习下大佬的项目