首页 > 代码库 > Hibernate详讲
Hibernate详讲
一 概述
1.JPA
Java Persistence API,是Java EE为ORM框架定义的规范,任何使用java语言的ORM框架都必须实现该规范。Hibernate/Mybatis都是是JPA的一种实现。
2.ORM
Object Relational Mapping,对象到关系的映射,在关系型数据库与对象之间建立映射关系,以实体对象操作关系型数据库。
3.持久化
将对数据库的操作永久地反映到数据库中的过程叫做持久化。
4.持久层框架
封装了对数据库进行持久化操作的框架叫做持久化框架。所谓框架就是在内部实现了一些常用的基本操作,提供简单的接口,缩减操作步骤,而且扩展了功能。
二 数据库连接池
1.背景
数据库连接是一个极其有限的宝贵资源,在Web应用程序中表现得尤为突出。Web应用访问量大,而数据库支持的并发连接数目是有限的,连接越多,速度越慢,降低了用户体验。
在数据库连接池产生以前,访问数据库需要先建立连接,访问结束后关闭连接,下次需要时再重复创建与关闭过程,而数据库连接的创建与关闭本身消耗大量的系统资源,这时产生了共享数据库连接的思想,数据库连接池应运而生。
2.数据库连接池的含义
- 数据库连接池提供与管理用于访问数据库的连接。
- 数据库连接池在初始化阶段会创建一定数量的数据库连接,投放到数据连接池中。
- 用户访问数据库时不创建连接,而是从数据库连接池中获取连接,访问完毕后,不关闭连接,而是将连接归还连接池,以实现连接的重复使用。
3.常用数据连接池
- C3P0是一种开放源代码的JDBC连接池。
- DBCP。
4.配置数据源
Hibernate框架推荐使用C3P0:
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
三 Hibernate简介
1.基本流程
2.Configuration
负责加载配置文件,启动Hibernate。配置文件的默认名称为“hibernate.cfg.xml”,放在类路径下。
3.SessionFactory
负责创建Session对象,保存了当前数据库中所有的映射关系,线程安全。重量级对象,初始化过程耗费大量的资源,因此在应用程序中应避免创建多个SessionFactory对象。
4.Session
⑴含义
代表应用程序与数据库的一次会话,是Hibernate中持久化操作的核心,直接负责所有的持久化操作。
⑵非线程安全
session对象线程不安全,应避免多个线程共享一个Session对象。多个线程共享一个session对象,可能会因为session缓存的存在出现数据泄露,或者一个线程关闭了session对象,另一个线程出现异常。
⑶依赖事务
Session只能在事务内部运行,即未开启事务,无法运行Session。
⑷创建
Session session=sessionFactory.openSession();
Session session=sessionFactory.getCurrentSession();
- 第一种方式不需要配置,直接使用,第二种方式必须在配置文件中配置,配置如下:
<property name="current_session_context_class">thread</property>
- openSession每调用一次创建一个Session对象,getCurrentSession在同一个线程内部获得的是同一个Session对象。
- 第二种方式创建的对象与线程绑定,第一种未与线程绑定。第二种方式创建的对象在事务提交或者回滚后自动关闭,第一种方式创建的连接必须手动关闭。
⑸关闭
- Session一旦被关闭,就与线程解除了绑定关系,下一次通过该线程获得的是不同的Session对象。
- Session关闭以后,断开了与数据库的连接,就无法通过该Session对象访问数据库。
Session一旦关闭,就标志着应用程序与数据库的一次会话结束,再次通信需要建立新的会话。
5.主键生成策略
生成策略 | 含义 | 维护方 |
increment | 获取数据库中当前主键的最大值,加1作为新数据的主键 | Hibernate |
identity | 按照自增方式生成主键 | 数据库 |
native | 从底层数据库支持的主键生成策略中选择 | 数据库 |
assigned | 由程序员手动生成主键 | 程序员 |
sequence | 基于sequence表生成主键 | 数据库 |
uuid | 生成一个全球唯一的32位主键 | 数据库 |
四 持久化对象的状态
1.瞬时状态
对象被创建、未被Session调用时的状态,与数据库中的数据无连接,一旦被Session通过save或者saveOrUpdate调用方法转化为持久化状态。
2.持久化状态
被Session调用后、与数据库中的数据存在关联的状态。
3.脱管状态
当Session对象关闭以后,持久化对象由持久状态转化为脱管状态,持久化对象处在脱管状态下仍然与数据库中的数据存在关联,通过update或者saveOrUpdate转化为持久化状态
4.集合角度
假如把关系型数据库中的表看做一个持久化类,每一行记录都是一个该类的对象,即持久化对象,一个对象如果在集合之外,则处于瞬时状态;在集合之内并且正在被Session调用,处在持久化状态;如果Session关闭,处在脱管状态。
5.内存地址
对象的状态发生改变时,对象在内存中的地址并未发生改变,仍然是同一对象,只是对象与数据库的关系发生改变。
五 持久化操作
1.插入数据
session.save(Object obj);
2查询数据
⑴get
Object obj=(Object)session.get(Object.class,Serializable id);
⑵load
Object obj=(Object)session.get(Object.class,Serializable id);
返回对象的代理,在对象被调用时,才向数据库发送SQL语句。
3.删除数据
Object obj=session.get(Object.class,Serializable id); session.delete(obj);
4.修改数据
Object obj=session.get(Object.class,Serializable id); obj.setter();//调用setter方法修改对象属性
5.其他方法
- clear():清空Session缓存,取消所有未执行的操作。
- evict():立即从Session缓存中删除指定的对象。
六 同步时间点与刷新时间点
1.同步时间点
事务提交是Hibernate中唯一的同步时间点,事务提交时将Session缓存中的数据同步到数据库。
2.刷新时间点
遇到Query查询、flush方法、事务提交时,执行删除与修改操作更新session缓存中的内容,只有在事务提交时才同步到数据库。
3.目的
刷新时间是为了在事务提交前执行针对数据库的操作,减少访问数据库的次数,降低数据库负担,只对删改操作有效,对插入与加载无效,对清空缓存无效。
4.flush
修改缓存中已有的对象,比如修改对象属性值,删除对象,不会清空缓存,不会同步到数据库,不影响那些与缓存内容无关的操纵,比如save\get操作不受flush影响,立即执行。
5.快照约束
同步时间点与刷新时间点都受快照的约束。
Hibernate详讲