hibernate 三种状态、一级缓存、快照、加载策略、并发控制
-
对象的三种状态(hibernate管理的对象)
1.1 临时状态
1.2 持久状态
1.3 游离状态 -
一级缓存、快照
通过调用hibernatesession接口的get方法后,user对象被加载为持久化对象
同时加入到hibernate的session一级缓存中,并留下一个快照u = {1 ww 20 2018-5-3 abcd} --> u = {1 qq 17 null xyz}
u’ = {1 ww 20 2018-5-3 abcd}
-
加载策略
3.1 立即加载
get方法(立即加载)
两种情况:
1.当前user对象属性未修改,则不执行update
2.当前user对象属性已修改,与存入hibernate一级缓存中的快照对象进行对比
修改前属性:user=[id=4,username=admin,password=1233]
修改后属性:user=[id=4,username=root,password=0000]
当执行commit()时,Hibernate同时会清理session的一级 缓存(flush),也就是将
堆内存中的数据与快照中的数据进行对比,如果不一致,则会执行更新(update)
操作 ,若相同,则不执行update。
4、一个方法内先后执行两个事务,此时用的是一个session,会利用hibernate的一级缓存机制。
3.2 延迟加载(懒加载)
代理对象
存单
LazyInitializationException
使用load方法表示延迟加载
注意:oid(对象标识符)
1,通过调用hibernate的session接口的load方法后返回一个代理对象
2.代理对象中的只有oid属性有值
3,在访问对象的非oid属性:代理对象将会执行初始化操作
执行代理对象初始化操作,因为调用了user对象的tostring方法,即访问了非oid属性
两种情况:
1.关闭session访问代理对象的非oid属性报错,延迟加载异常LazyInitializationException
2.不关闭session,访问代理对象的非oid属性,执行代理对象的初始化操作
- 并发控制
version=2 2
A:
update t_student set sname=‘zs’, version=version+1
where sid = 8 and version=1
B:
update t_student set sname=‘ls’, version=version+1
where sid = 8 and version=2