知识点
- 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对象 


