一. Hibernate中对象的三种状态
1. 瞬时状态(transient)
当我们通过Java的new关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,此时该对象只是通过JVM获得了一块内存空间,还并没有通过Session对象的save()方法保存进数据库,因此也就还没有纳入Hibernate的缓存管理中,也就是说该对象现在还自由的游荡于Hibernate缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。
瞬时状态特点:
I: 不和 Session 实例关联;
II: 在数据库中没有和瞬时对象关联的记录
2. 持久状态(persistent)
持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于Hibernate的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。
持久状态特点:
I: Session 实例关联
II: 在数据库中有和持久对象关联的记录
3. 游离状态(detached)
当一个持久化对象,脱离开Hibernate的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录,只是现在这个游离对象脱离了Hibernate的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。
脱管对象特点:
I: 本质上和瞬时对象相同
II: 只是比爱瞬时对象多了一个数据库记录标识值 id.
三种状态相互转化的状态图如下:
二. Hibernate执行update操作会访问数据库几次
首先你要知道Hibernate执行update的运行机理,Hibernate的update是怎么样自动进行update操作的呢?
(1). hibernate会执行一个select操作,到数据库中查找,当前要update操作的对象的主键是否存在,类似于:
select id from table where id=xxx;
(2).执行更新操作
I: 如果查到了该ID,就说明该对象是一个持久化对象,如果该对象的某些属性变化了,Hibernate就会自动的执行update操作,同步数据库中的该对象。
II: 如果Hibernate没有查找到该ID,就说明该对象是一个游离的对象,Hibernate就会自行insert操作。
根据这些,就可以明白要update的对象的ID在数据库中不存在,或者更改该对象的ID,这些都是执行insert而不是update。
三. Hibernate中一级缓存和二级缓存
1. 一级缓存二级缓存的概念解析
(1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个
session(一定要同一个session)又做了同一个操作,那么hibernate直接从一级缓存