持久化對象的生命週期數據庫
對象在Hiberurnate中的狀態有三種session
自由態spa
Object若是不和Session發生關係,則Object處於自由態。對象
new建立一個Object時,爲自由態;生命週期
當持久態Object進行session.delete(Object)時,Object會回到自由態;get
持久態同步
Object和Session發生關係,則Object處於持久態。io
持久態的Object內容發生變化時,會同步到數據庫中的相應數據行;date
調用session.get(key)和session.load(key)得到一個Object的時候爲持久態;select
注意:.get(key)和.load(key)的區別
session.get(key)會當即執行select語句,並返回對應key的數據庫Object;
session.load(key)不會馬上執行select語句,會在使用這個Object時執行select;
若是調用一個沒有查詢出結果的session.get(key)返回對象,會得到NullPorenterExeption;
若是調用一個沒有查詢出結果的session.load(key)返回對象,會得到ObjectNotFoundException;
調用session.save(Object)和session.persist(Object)對一個自由態Object使用時,數據會被存進數據庫保存入數據庫當中,Object會進入持久態,二者的區別在於session.save(Object)會返回持久態Object的key;
遊離態
調用session.clear()會把Session中的全部持久態Object進入遊離態;
調用session.flush()會把Session中Object的更新同步到數據庫的相應數據行
注意:session.sava(Object)和session.update(Object)的區別
session.sava(Object)對一個自由態Object進行保存到數據庫中,而且讓Object進入持久態;
session.update(Object)對一個遊離態Object進行保存到數據庫中,並將讓Obbject進入持久態;
調用session.saveOrUpdate(Object)時,方法會自動判斷Object處於什麼狀態,並使用相應的操做將Object保存到數據庫中;
若是Object處於自由態,調用session.update(Object)時,不會有任何做用;
特殊方法
調用session. getTransaction().merge(Object)時,若是持久化Object在數據庫中存在,會進行同步操做。若是Object在數據庫不存在,會進行保存操做;
調用session. getTransaction().merge(Object)時,若是Object是遊離態的,會進行同步操做,操做後對象會從新回到遊離態。
當同一個Session中存在兩個Object的key相同時,調用session.saveOrUpdate(Object)方法的話會有錯誤拋出,調用session. getTransaction().merge(Object)方法的話會執行同步操做;