hibernate 三種狀態、一級緩存、快照、加載策略、並發控制

對象的三種狀態(hibernate管理的對象)

1.1 臨時狀態

1.2 持久狀態

1.3 遊離狀態

hibernate 三種狀態、一級緩存、快照、加載策略、併發控制

一級緩存、快照

通過調用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


分享到:


相關文章: