對象的三種狀態(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
閱讀更多 程序員界的彭于晏 的文章