知识点
- Hibernate概述
数据持久化、ORM概念及原理、Hibernate编程步骤 - Hibernate基础
实体映射、ID生成器、Hibernate数据类型,Hibernate对象生命周期 - 关联映射
一对一、一对多、多对多 - 高级映射
组合映射、继承映射、值集合映射 - 事务管理
事务传播性、事务隔离级别、事务控制 - 高级查询
Criteria、HQL
一、对象持久化
1、持久(Persistence)
- 数据保存到可掉电设备中。
- 企业级应用中,即把内存中(瞬时)的数据保存到磁盘中加以“固化”。
2、对象持久化技术
- Java对象序列化和反序列化:数据查询困难,效率低
- 通过XML保存对象:复杂的xml操作,用于应用或公司间进行数据传输
- JDBC:关系型数据库(RDBMS),SQL(DDL, DML):低水平的数据操作
- 对象关系映射(ORM)
二、JDBC的缺点
1、JDBC编程步骤
- 注册驱动
- 建立到数据库的连接
- 创建statement
- 执行SQL语句
- 处理ResultSet
- 关闭JDBC对象
缺点:重复的编程步骤
2、JDBC数据封装
JDBC数据封装过程
缺点:编程人员大部分精力花费在对ResultSet数据封装。
三、ORM
1、概念
Object Relational Mapping(对象关系映射),通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。
2、ORM包括四个部分
- 一个对持久类对象进行CRUD操作的API
- 一个语言或API用来规定与类和类属性相关的查询
- 一个规定元数据映射的工具
- 一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化功能
3、为什么采用ORM模式
- 提高生产率(Productivity)
- 可维护性(Maintainability)
- 更好的性能(Performance)
- 厂商独立性(Vendor independence)
4、ORM主流框架
- Hibernate:开源、性能、稳定性
- TopLink:Oracle商业商业产品
- Ibatis、MyBatis:开源、开放性
- Apache OJB:开源、性能、稳定性、支持各种标准规范
四、Hibernate简介
Hibernate强大功能,按照Java基础语义(关联、继承、多态、组合及Java集合框架)的持久层开发,面对对象查询语言(HQL)。
1、Hibernate 环境配置
库文件包
antlr.jar
— HQL转换工具asm.jar, asm-attrs.jar
— generate and transform classescglib.jar
— 实现PO字节码的动态生成dom4j.jar
— 读写xmlhibernate3.jar
— 核心包jta.jar
— JAVA 事务处理接口commons-collections.jar
— Apache Commons包中的一个,开发的集合类commons-logging.jar
— Apache Commons包中的一个,日志功能ojdbc14.jar
— oracle驱动包c3p0.jar
— 数据库连接池ejb3-persistence.jar, hibernate-annotations.jar
— 注解基础包hibernate-entitymanager.jar
— JPA支持包javassit.jar
— 代码生成包jboss-archive-browsing.jar
— support JPA entity manager
2、Hibernate应用组成
- DDL(可选) — sql
- POJO(plain object java obiect) — 持久化类
- Id
- 需映射属性的get/set方法
- 空参构造方法
- Hibernate配置文件 — hibernate.cfg.xml or hibernate.properties
- 创建对象-关系映射 — .hbm.xml or 注解
- 通过Hibernate API访问数据库的代码
3、Hibernate项目结构
4、Hibernate开发步骤—API应用步骤
- 创建Hibernate配置,读取Hibernate配置文件及信息
- 用读取的配置信息生成SessionFactory对象
- 从SessionFactory对象获取一个Session对象
- 用Session对象生成事务
- 通过Session对象的方法进行操作
- 提交或回滚事务
- 释放session and session factory资源
5、Hibernate核心API
- Session
是数据连接与事务管理 间的中间接口,它是非线程安全的,所以一个线程只创建一个Session对象。
save()/beginTrasaction()/close()/delete()/get()/load()/persist()/saveOrUpdate()/update()
- SessionFactory
负责创建Session对象, SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。可以通过Configuration对象创建SessionFactory对象。
openSession()/close()
- Configuration
配置hibernate,启动hibernate 时读取cfg.xml ,创建SessionFactory对象。
config()
- Transaction
数据库事务接口, 可选接口,将应用代码从底层的事务实现中抽象出来,可能会是:JDBC事务、JTA用户事务
commit()/rollback()
- Query
查询接口,query实例包装了HQL查询语句。
list()/setXXX()
- Criteria
查询接口,用于创建和执行条件查询,更面向对象。
list()/add()/createCriteria()
6、Hibernate对象生命周期
对象生命周期:一个对象从被创建开始,到不再使用,被垃圾回收期回收为止。一个持久化类的实例可能处于三种不同状态中的某一种。 这三种状态的定义则与所谓的持久化上下文(persistence context)有关:
- 瞬时状态 (Transient)
- 持久状态(Persistent)
- 脱管状态(Detached)
Hibernate的Session对象就是这个所谓的持久化上下文
- 瞬时对象
由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的
瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)
如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁
使用Hibernate Session可以将其变为持久(Persistent)状态 - 持久对象
持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)
Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)
在默认情况下,Hibernate会在UPDATE中包含所有的列
如果只更新那些被修改的列,可以通过修改配置dynamic-update="true"
来实现 - 脱管对象
实例曾经与某个持久化上下文发生过关联,不过那个上下文被关闭了, 或者这个实例是被序列化(serialize)到另外的进程。 它拥有持久化标识,并且在数据库中存在一个对应的行
脱管(Detached)对象不在持久化管理之内,但对脱管对象的引用依然有效,对象可继续被修改
Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象