Hibernate框架
l Hibernate是一个基于元数据的轻量级的ORM框架
- 元数据(Meta Data):Data about data (关于数据的数据)描述数据(数据库)以及环境相关的数据(关联数据)。
- 轻量级:占用的资源不是很多,没有侵入性。
- ORM:Object – Relation Mapping
将Java中对象和数据库的相关内容进行关系映射。类和表,对象和表中的数据,属性和字段。操作数据库采用面向对象的方式完成。
对象模型 |
关系模型 |
面向对象分析设计(UML) |
数据库设计(PD) |
类(关系) |
表(关系) |
属性 |
字段 |
Java类型 |
SQL类型 |
对象(主键属性OID) |
记录(PK) |
- POJO:(Plain Ordinary Java Object) 无格式的普通java对象,java对象中没有包含任何的逻辑代码,从数据层面上来看,POJO对象可以看做数据库中的实体化(对象化)表现方式。也称为实体类(Entity Class)
也称为域模型对象(domain)
l 实体域模型对象(User)POJO
l 过程域模型对象(DAO,BO)
l 事件域模型对象(事件,异常)
- VO:(Value Object) 描述数据的对象。(Page 分页类)
- 持久化:
狭义:将内存对象永久保存到数据库过程
广义:就是指对数据的CRUD
l Hibernate框架应用环境搭建
- 拷贝常用jar包
- 创建hibernate.cfg.xml配置文件
连接数据库信息
方言
管理映射文件
其他(属性配置等)
l Hibernate框架的核心API
- SessionFactory
- Session
- Transaction
- Query
- Criteria
- Configuration
l Hibernate框架的主键生成策略
- 表示如何生成表的主键
- 主键的类型
u 代理主键(推荐)
l 提供一个和业务无关并且能够唯一标识一条记录的字段作为主键(一般是自增的,整型)
u 自然主键
l 提供一个与业务相关的主键
- 主键生成策略有3种方式
u 由数据库来生成主键(代理主键)
l native :表示由方言决定采用什么数据库的主键生成方式。
n 如果是mysql方言,那么就会采用自增长方式
n 如果是Oracle方言,那么就会采用序列方式
l sequence :表示采用数据库的序列方式生成主键,可以应用在Oracle,DB2数据库中
l identity :表示采用自增长的主键生成方式,可以应用MySQL,SQL Server 数据库
u 由Hibernate框架来生成主键(代理主键)
l uuid :表示由框架根据参数(IP地址,JVM启动时间,系统时间,计算器)生成32位16进制的数字字符串。推荐使用。主键属性必须是字符串类型。
n 表示数据量大,添加数据效率高,查询效率低,通用移植性好
l increment:表示由框架本身提供的计数器的方式自动增长。
u 由用户来生成主键(自然主键)
l assigned :表示主键由用户自己维护。
l Hibernate框架的对象三种状态
- 瞬时状态(Transient Object ) 临时状态
u 数据库中没有与之对应的数据
u 对象与框架没有关联
- 持久化状态(Persistent Object)
u 数据中一般是存在与之对应的数据
u 对象与框架一定关联
- 游离状态(Detached Object) 离线状态,托管状态
u 数据库中一定有与之对应的数据
u 对象与框架没有关联,或连接断开。
l Hibernate框架中保存操作
- 瞬时状态的对象可以保存
- 持久化状态的对象不能保存
持久化状态的含义就是对象和数据库中的一条数据对应,那么再保存就会有冲突了,所以不能保存。
- 游离状态的对象不应该保存
主键生成策略不是自己维护的情况下,可以保存成功。
l Hibernate框架中的更新操作(主键更新)
- 瞬时状态的对象不能更新
- 持久化状态的对象不能更新
不需要显示调用update方法进行更新。持久化对象属性值变化会自动更新
- 游离状态的对象可以更新
l Hibernate框架中的删除操作(主键删除)
- 瞬时状态的对象不能删除
- 持久化状态的对象可以删除
- 游离状态的对象可以删除
删除时框架会先查询(select)数据库中是否存在,如果存在则可以删除。
l Hibernate的主键查询
- Get
u 返回结果:持久化对象或null(非空判断)
u 不支持延迟加载
u 支持缓存
- Load
u 返回结果:持久化对象或异常或代理对象
u 默认支持延迟加载
l 禁用延迟加载,可以设置<class lazy=”false”/>
u 支持缓存
l Hibernate面向对象查询
- HQL
u 其实就是对SQL的封装
u Query接口
u list()方法
l 支持缓存,但自己不利用缓存
l 如果希望利用缓存,可以配置查询缓存
u iterate()方法 (N+1条语句)
l 支持缓存,并且利用缓存
l 使用一般和带缓存的方法一起用
u 批量操作DML(insert,update,delete)
l 不支持缓存操作
- QBC
u 动态参数查询
l Hibernate框架的映射关系
- 基本的映射关系
u 多对一 (学生和班级)
l <many-to-one>
l 级联关系
n 级联不能使用delete和all
l 延迟加载
l 抓取策略
l 抓取策略是join的话,那么延迟加载不起作用。
u 一对多(班级和学生)
l 级联关系
l 延迟加载
l 抓取策略
l 反转操作(inverse=”true”)
u 多对多(学生和课程)
l 级联不应该使用delete和all
l 在任意其中一端设置反转操作
l 中间表示的两个外键不要为null,表示联合主键
u 自关联
l 是双向的一对多和多对一的特殊情况
l 使用一张表来描述数据的关系,外键字段可以为null
l MyEclipse-Tools
- 由类到表
- 由表到类(可以提高开发效率)
l Hibernate框架的延迟加载
- 应用原因
- 应用场合
- 应用标签
- 使用约束
- 使用有效期
l 解决延迟加载的方案
- 保证Session在视图层是打开状态(OpenSessionInView模式)
- ThreadLocal + Filter
l Hibernate框架的缓存
- 一级缓存(session缓存)
u 默认支持
- 二级缓存(SessionFactroy缓存)
u 默认不支持
u Ehcache
- 查询缓存(HQL,Query)
u 不推荐使用,查询命中率不是很高。
l Hibernate框架解决数据冲突问题
- 悲观锁
u 行级锁 select .. for update
u 类似线程同步,性能低
- 乐观锁(推荐)
u 时间戳
u 版本号(Hibernate)
l Hibernate框架的注解
- 注解和配置文件的比较
- JPA
- Hibernate框架应用开发时常用的注解
l Hibernate框架的POJO类设计规则
- 一定要存在默认的构造方法
- 构造方法可以是private的,但是对于cglib代理的应用,修饰符至少protected
- 尽量不要使用final修饰
- 尽量实现可序列化接口
- 属性的get/set方法是需要提供的,如果不提交的话,需要设置标签的access="field"
l Hibernate框架的总结
- 优点
u 轻量级的ORM框架
u 提供延迟加载功能,缓存机制
u 透明持久化,操作对象就等同操作数据库,隐藏了持久化的过程,使操作起来更加容易
- 缺点
u 由于面向对象的操作方式,进行大数据量操作时性能比较低
u 执行效率比 jdbc,ibatis低
u 影响表的设计原则
l Hibernate框架的竞争
- JPA(规范)
- Oracle TopLink
- SUN JDO
- Apache OJB
l 框架的优化
- Struts2
u 去掉使用不到的拦截器
u 过滤器的过滤规则尽量不要使用/*
u 关闭开发模式(devMode)
- Hibernate
u 尽量使用延迟加载
u 使用缓存(只读)
u 尽量使用乐观锁代替悲观锁
u 尽量使用框架的最新版本,一般会有性能方面的支持
u 推荐使用uuid主键生成策略,移植性好,支持大数据量