1. 程式人生 > >hibernate學習筆記第三天

hibernate學習筆記第三天

delet unique lis 多少 update 從數據 將不 不同的 get方法

復習
環境搭建
配置->工廠->Session->事務
Query list uniqueResult
Criteria(QBC)
配置
------------------------------------
對象的狀態
瞬時狀態: 瞬時對象(TO)
應用程序創建出來的對象,不受H3控制
註意:TO對象不具有OID,一旦為TO賦值OID,那麽此時就不是TO
持久化狀態:持久化對象(PO)
受H3控制的對象,PO一定具有OID
托管狀態: 托管對象(DO)
曾經受到H3控制,當前不受H3控制(Session關閉),一定具有OID
給TO賦值OID
TO,PO,DO的區別
1.受控(Session)
2.OID
對象狀態對應的時機
TO
new創建的對象並且不攜帶OID
PO
save後的對象 update後的對象
saveOrUpdate後的對象 merge後的對象
delete後的對象
load/get等通過查詢方法獲取到的對象
Query Criteria讀取的數據對應的對象
DO
Session關閉後,在此Session操作過程中所有的PO對象
手工清除session中的某個PO(特殊)
為TO對象指定OID

一級緩存
什麽是緩存?數據的臨時存儲空間,緩存中保存的數據是真實數據的一份拷貝
H3具有兩級緩存
一級緩存(H3自帶)
二級緩存(外部技術實現)

一級緩存
H3內部Session操作的數據就是保存在一級緩存中,無論Session操作多少個對象,都存放在這個空間內
不同的Session對應存儲的區域是不同的區域
一級緩存的操作
1.證明一級緩存存在性
無論進行什麽樣的操作,只要Session控制過某個對象,該對象就加入一級緩存
下一次使用直接從一級緩存中獲取
2.get/load區別
load/get在查詢時,首先判斷一級緩存中是否存在該數據
如果存在,直接獲取
如果不存在,執行下面的操作
get方法獲取數據將直接執行SQL語句,從數據庫獲取,將數據加載到一級緩存
load方法獲取數據,先不執行SQL,創建一個代理對象,只具有OID,並且放入一級緩存
當開發者只使用OID屬性時,不用執行查詢
當開發者使用OID屬性之外的屬性時,才執行查詢
load方法的延遲加載
關閉lazy延遲加載功能:
1.
2.
3.
lazy=false,load方法與get方法基本相同
3.讀取一級緩存,SQL執行後獲取數據並加載到一級緩存
4.修改數據,將要修改的數據放入一級緩存,此時不執行SQL,刷新一級緩存時執行
5.刷新一級緩存的方式
執行事務提交
t.commit();
刷新Session範圍的緩存數據
s.flush();
關閉Session
s.close();
刷新緩存對應的操作一定要基於事務,如果沒有事務保障,緩存數據將不與數據庫同步
flush操作是強制將一級緩存數據與數據庫同步,因此此時無需事務保障就可以進行
6.快照
快照保存了一級緩存中的一份數據的克隆,當一級緩存中的數據發生改變時,如果刷新緩存
首先與快照進行比對
如果不同,更新數據庫,執行UPDATE,同時更新快照
如果相同,不做任何動作
7.操作一級緩存
刷新一級緩存
s.flush();
清除一級緩存
s.clear();
清除一級緩存中指定對象
s.evict(obj);
更新一級緩存中指定對象(使用數據庫中數據覆蓋一級緩存數據及快照數據)
s.refresh(obj);
8.一級緩存刷新時機

一級緩存操作註意事項
1.save TO->PO
2.update
2.1 DO->PO
2.2 在update將DO->PO之前,可以將數據庫中的信息加載到快照區
如果緩存數據與加載的快照數據相同,避免執行無效的UPDATE
在class元素中配置select-before-update,該配置值默認false
2.3 DO->PO 必須保障OID是數據庫端存在的,如果不存在將拋出異常
2.4 DO->PO 如果存在相同OID的PO,此時拋出異常
3.saveOrUpdate
對TO操作,insert
對DO操作,update
4.megre
如果當前緩存中存在有相同的OID數據,那麽將現有合並的對象數據與原始的PO進行數據合並
如果當前緩存中沒有相同的OID數據,那麽首先判斷當前的DO是否在數據庫中存在,執行查詢
如果查詢到了存在有DO對應的OID,修改
如果查詢沒有存在的OID,插入
5.get/load
get如果獲取的OID不存在,返回null
load如果獲取的OID不存在,拋異常
6.delete
刪除一個PO對象
如果是DO,首先DO->PO,然後刪除PO
操作註意事項:
增刪改數據時,先將對象->PO,然後再刷新緩存時才執行對應的操作
PO (insert)*
flush刷新時,如果是insert
1.檢測OID存在性
不存在,並且沒有生成策略,報錯
不存在,有生成策略,先獲取OID,此時TO->PO->INSERT
PO (update)
PO (delete)
PO ()
PO (update)

關聯關系
一對一
用戶數據
1 張三 男 23 河南 1 1 2000 100 -35.6 -120
一對多
多對多

hibernate學習筆記第三天