三種狀態
Transient(臨時狀態):new出來的對象;它沒有持久化,不存在于Session中——此狀態中的對象為臨時對象。
Persistent(持久化狀態):已經持久化,存在于Session緩存中;如經hibernate語句save()保存的對象——此狀態對象為持久對象。
Detached(游離狀態):持久化對象脫離了Session后的對象。如Session緩存被清空后的對象。已經持久化,單不存在于Session中——此狀態中的對象為游離對象。
三種狀態的區分:
(1)對象有沒有Id——如果沒有Id,一定是Transient狀態
(2)Id在數據庫中有沒有
(3)在內存中有沒有(session緩存)
Transient: new出來一個對象,緩存和數據庫都沒有id;
Persistent:內存、緩存、數據庫都有id;
Detached:內存、數據庫有id,緩存沒有
三種狀態與SQL語句:
如果一個對象已經是持久化狀態了,那么此時對該對象進行各種修改,或者調用多次update、save方法時,hibernate都不會發送sql語句,只有當事務提交的時候,此時hibernate才會拿當前這個對象與之前保存在session中的持久化對象進行比較,如果不相同就發送一條update的sql語句,否則就不會發送update語句
持久化對象在進行修改之后,調用session.clear()方法,這個時候就會將session的緩存對象清空,那么session中就沒有了這個對象,這個時候在提交事務的時候,發現已經session中已經沒有該對象了,所以就不會進行任何操作
Session的方法
save方法:
1.系統根據指定的ID生成策略,為臨時對象生成一個唯一的OID;
2.將臨時對象加載到緩存中,使之變成持久化對象;
3.提交事務時,清理緩存,利用持久化對象包含的信息生成insert語句,將持久化對象保存到數據庫。
update方法:
1.用來更新detached對象,更新完成后轉為persistent狀態。
2.更新自己設定的唯一標識符(例如:Id)的transient對象且數據庫有對應記錄的可以update。
3.處于persistent狀態的對象,對這個對象的屬性內容進行更改后當commit時會自動觸發Session update方法。
4.在XXX.hbm.xml文件中的設置dynamic-update=”true” 這樣就可以實現部分只進行了更改字段的更新。
delete方法:
刪除的時候是通過主鍵進行刪除的,所以即使設置了不對應的其它字段也是可以正常刪除數據的。
get方法:
1.返回的對象是persistent持久化對象。
2.調用時發出查詢sql。
3.查不到返回null。
4.沒有延遲加載。
5.get方法首先會查詢session緩存,沒有的話就查詢二級緩存,最后會查詢數據庫。
load方法:
1.返回的對象是persistent持久化對象。
2.調用延遲加載,原理是用CGLIB生成代理類,采用繼承,生成子類。
3.真正使用對象的時候才發出查詢sql語句,先去二級緩存中查詢,如果沒有,再去數據庫中查詢。
4.如果查找不到會產生異常org.hibernate.ObjectNotFoundException。