Hibernate的Session缓存(一级缓存):
作用:可以减少应用程序访问数据库的次数
生命周期:只要session没有结束生命周期,并且没有清理缓存,那么存放在缓存中的对象也会一直存在
hibernate把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态,session的特定方法能使对象从一个状态转换到另一个状态
临时对象(Transient): 1.在使用代理主键的情况下,OID通常为null 2.不处于session缓存中 3.在数据库中没有对应记录
持久化对象(Persisit): 1.OID不为null 2.位于session缓存中 3.若在数据库中有和其对应的记录,持久化对象和数据库中的相关记录对应
4.session在flush缓存时,会根据持久化对象的属性变化来同步更新数据库
5.再同一个session实例的缓存中,数据表中的每条记录只对应唯一的持久化对象
删除对象(Removed): 1.在数据库中没有和OID对应的记录 2.不再处于session缓存中 3.一般情况下,应用程序不应该再使用该对象
游离对象(Detached): 1.OID不为null 2.不再处于session缓存中 3.一般情况下,游离对象是由持久化对象转变过来的,因此数据库中还可能存在它的记录
数据库总共有4种事务隔离级别:
READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)、SERIALIABLE(可串行化)
Oracle支持2种:READ COMMITTED和SERIALIABLE,默认第一种
mysql支持4种:默认REPEATABLE READ
Session常用的几个方法:
flush():清理缓存,强制使数据表中的记录和session缓存中保持一致,为了保持一致可能会发送sql语句;
1.在commit()方法中,先调用session的flush()方法再提交事务
2.flush()方法可能会发送sql语句,但不会提交事务
3.注意:在未提交事务,或显示的调用session.flush()之前也有可能调用flush()
1)执行HQL或者QBC查询,会先进行flush()操作,保证得到的是数据表中最新的记录
2)若记录的ID是由底层数据库使用自增实现的,那么调用save()方法的时候会立即发送Insert语句,因为save()方法后必须保证对象的Id是存在的
refresh():会强制发送SQL语句,使得session缓存中的对象状态和数据表中的一致;
clear():清除缓存中的内容;
save():保存对象
1.使临时对象变为持久化对象
2.为对象分配ID
3.在flush()缓存时,会发送一条insert语句
4.在save()对象之前设置ID是无效的
5.持久化对象的ID是不能被修改的
Persist():也会执行一个insert()操作,与save()的区别:在Persist()操作之前,对象已经有Id的话,则不会执行insert()操作,抛出异常
get() 和 load() :都是从数据表中获取对象,但还是有区别
1.执行get()语句会立即加载该对象:立即检索
执行load(),若不使用该对象,则不会立即执行查询操作,而是返回一个代理对象
2.若数据表中没有对应记录,并且session没有关闭,同时需要使用对象时,get()返回null,load()抛出异常
3.load()可能会抛出LazyInitException异常,在需要初始化代理对象之前就关闭session就会抛出此异常