Hibernate 对象的三种状态
Hibernate 對象的三種狀態
瞬時(transient):
由new操作符創建,且尚未與Hibernate Session關聯的對象被認定為瞬時(Transient)的。瞬時(Transient)對象不會被持久化到數據庫中,也不會被賦予持久化標識(identifier)。如果瞬時(Transient)對象在程序中沒有被引用,它會被垃圾回收器(garbage collector)銷毀。使用Hibernate Session可以將其變為持久(Persistent)狀態。(Hibernate會自動執行必要的SQL語句)。
瞬時狀態的特點有:
1、 與數據庫中的記錄沒有任何關聯,也就是沒有與其相關聯的數據庫記錄。
2、 與Session沒有任何關系,也就是沒有通過Session對象的實例對其進行任何持久化的操作。
舉例:
User user=new User(); //user是一個瞬時對象,在數據庫的表中是沒有記錄和該對象相對應的。和session沒有關系。
user.setName(“ddd”);
user.setBirthday(new Date());
session.save(user); //持久化狀態
持久(persistent):
數據庫中有數據與之對應,當前與session有關聯,并且相關聯的session沒有關閉,事務沒有提交;持久對象狀態發生改變,在事務提交時會影響到數據(Hibernate能檢測到)。
持久(Persistent)是實例在數據庫中有對應的記錄,并擁有一個持久化標識(identifier)。持久(Persistent)的實例可能是剛被保存的,或剛被加載的,無論哪一種,按定義,它存在于相關聯的Session作用范圍內。Hibernate會檢測到處于持久(Persistent)狀態的對象的任何改動,在當前操作單元(unit of work)執行完畢時將對象數據(state)與數據庫同步(synchronize)。開發者不需要手動執行Update。將對象從持久(Persistent)狀態編程瞬時(Transient)狀態同樣也不需要手動執行delete語句。
持久對象具有如下特點:
1、 和session實例關聯;
2、 在數據庫中有與之關聯的記錄。
3、 Hibernate會根據持久態對象的屬性的變化而改變數據庫中的相應記錄。
舉例:
Session session = factory.openSession();Transaction tx = session.beginTransaction();session.save(stu); // persistent持久化狀態System.out.println(stu);tx.commit();session.close(); //執行close()方法之后,就會由持久對象轉換成脫管對象System.out.println(stu); // 脫管對象
脫管/游離(detached):數據庫中有數據與之對應,但沒有session與之關聯,脫管對象狀態發生改變,hibernate不能檢測到。
脫管狀態:
與持久(Persistent)狀態對象關聯的Session被關閉后,對象就變為脫管(Detached)的。對脫管(Detached)對象的引用依然有效,對象可繼續被修改。脫管(Detached)對象如果重新關聯到某個新的Session上,會再次轉變為持久(Transistent)的(在脫管Detached其間的改動將被持久化到數據庫)。這個功能使得一種編程模型,即中間會給用戶思考時間(user think-time)的長時間運行的操作單元(unit of work).
脫管對象擁有數據庫的識別值,可通過update()、saveOrUpdate()等方法,轉變成持久對象。
脫管對象具有如下特點:
1、 本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當的時候將它回收;
2、 比瞬時對象多了一個數據庫記錄標識值。
3、 不在于Session相關聯。
4、 脫管對象一定是由持久態對象轉化而來。
首先是我們的UML圖轉換:以及解析:
對以上圖形的解析:
1、當一個對象被new了以后此對象處于瞬時態(Transient);
2、然后對此對象執行session的save() 或者saveOrUpdate()方法后,此對象被放入session的一級緩存進入持久態.
2、當再對此對象執行evict()/close()/clear()的操作后此對象進入游離態(Detached)
4、游離態(Detached)和瞬時態(Transient)的對象由于沒有被session管理會在適當的時機被java的垃圾回收站(garbage)回收.
5、執行session的get()/load()/find()/iternte()等方法從數據庫里查詢的到的對象,處于持久態(Persistent).
6、當對數據庫中的紀錄進行update()/saveOrUpdate()/lock()操作后游離態的對象就過渡到持久態
7、處于持久態(Persistent)與游離態(Detached)的對象在數據庫中都有對應的記錄.
8、瞬時態(Transient)與游離態(Detached)的對象都可以被回收可是瞬時態的對象在數據庫中沒有對應的紀錄,而游離態的對象在數據庫中有對用的紀錄。
1、操縱持久化對象-save()
(1)Session 的 save() 方法使一個臨時對象轉變為持久化對象
(2)Session 的 save() 方法完成以下操作:
(3)把 News 對象加入到 Session 緩存中, 使它進入持久化狀態
(4)選用映射文件指定的標識符生成器, 為持久化對象分配唯一的 OID. 在使用代理主鍵的情況下, setId() 方法為 News 對象設置 OID 使無效的.
(5)計劃執行一條 insert 語句,把Customer對象當前的屬性值組裝到insert語句中
(6)Hibernate 通過持久化對象的 OID 來維持它和數據庫相關記錄的對應關系. 當 News 對象處于持久化狀態時, 不允許程序隨意修改它的 ID
2、 操縱持久化對象-update()
(1)Session 的 update() 方法使一個游離對象轉變為持久化對象, 并且計劃執行一條 update 語句.
3、操縱持久化對象-saveOrupdate()
saveOrUpdate:
該方法同時包含save和update方法,如果參數是臨時對象就用save方
法,如果是游離對象就用update方法,如果是持久化對象就直接返回。
如果參數是臨時對象就用save方法
如果是游離對象就用update方法
如果是持久化對象就直接返回,不執行操作
總結
以上是生活随笔為你收集整理的Hibernate 对象的三种状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx配置相关结构划分的技巧和禁止I
- 下一篇: Hibernate懒加载