hibernate中的PO持久化对象及PO三种状态
一,認識持久化對象PO:
在hibernate的應用程序中,每一個數據庫中的表都對應一個持久化對象PO。PO可以看成是與數據庫表相映射的java對象。最簡單的PO對應數據庫中某個表中的一條記錄,多個記錄可以對應PO的一個集合。
PO類即持久化類,其實就是一個普通的JavaBean,只是要申明遵循一定的規則就是一個PO。
package PO;public class UserInfoPO {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}} 定義PO遵循以下三個原則:
1,為持久化字段聲明私有屬性且提供getter和setter方法
2,實現一個無參構造函數。所有的持久化類都要有一個默認的構造函數,這樣hibernate就可以使用newInstance()來實例化它們。
3,提供一個標識符屬性。
? ? 標識符屬性,用于映射數據庫表的主鍵字段。這個屬性可以叫任何名字,其類型可以試任何原始類型,原始類型的包裝類型,String或者Date。
二,持久化對象的三種狀態:
Hibernate的PO對象有三種狀態:臨時狀態,持久狀態,脫管狀態。
1,臨時態
? 由new命令開辟內存空間剛生成的Java對象就處于臨時態。例如:UserInfoPO ui=new?UserInfoPO();如果沒有變量引用,他講被java虛擬機回收。
? 臨時對象在內存中是孤立存在的,它是攜帶信息的載體,不和數據庫的數據有任何關聯關系。在Hibernate中,可通過Session的save()或saveOrUpdate()方法將臨時對象與數據庫相關聯,并將數據插入到數據庫中,此時該臨時對象狀變成持久化對象。
臨時對象的特征。臨時對象具有以下特征:
(1) 不處于Session的緩存中,也可以說,不被任何一個Session實例關聯。
(2) 在數據庫中沒有對應的記錄。
(3)他們沒有任何跟數據庫表相關聯的行為
在以下情況下,Java對象進入臨時狀態:
(1) 當通過new語句剛創建了一個Java對象,它處于臨時狀態,此時不和數據庫中的任何記錄對應。
(2) Session的delete()方法能使一個持久化對象或游離對象轉變為臨時對象。對于游離對象,delete()方法從數據庫中刪除與它對應的記錄;對于持久化對象,delete()方法從數據庫中刪除與它對應的記錄,并且把它從Session的緩存中刪除。
2,持久態
?處于該狀態的對象在數據庫中具有對應的記錄,并擁有一個持久化標志。如果使用delete方法。對應的持久化對象就會變成臨時對象。因為數據庫中對應的數據已被刪除,該對象不在與數據庫的記錄相關聯。
?當session執行close()和clear()之后,持久對象變成脫管對象,此時持久對象會變成脫管對象,此時該對象有數據庫識別值,但不在hibernate持久層管理之下。
持久對象具有如下特點:
1)和session實例關聯,位于一個Session實例的緩存中
2)在數據庫中有關聯記錄。
Session的許多方法都能夠觸發Java對象進入持久化狀態:
(1) Session的save()方法把臨時對象轉變為持久化對象。
(2) Session的load()或get()方法返回的對象總是處于持久化狀態。
(3) Session的find()方法返回的List集合中存放的都是持久化對象。
(4) Session的update()、saveOrUpdate()和lock()方法使游離對象轉變為持久化對象。
(5)當一個持久化對象關聯一個臨時對象,在允許級聯保存的情況下,Session在清理緩存時會把這個臨時對象也轉變為持久化對象。
3,脫管態:
某持久化對象的session被關閉后,持久化對象就變成了脫管對象,這個對象不能再與數據庫保持同步,他們不再受Hibernate管理。當脫管對象被重新關聯上Session時,將再次轉變成持久化對象。
脫管對象有如下特點:
1)不再位于Session的緩存中
2),因此在數據庫中可能還存在與它對應的記錄(前提條件是沒有其他程序刪除了這條記錄)。
脫管對象與臨時對象的相同之處:
? ? ?兩者都不被Session關聯,因此Hibernate不會保證它們的屬性變化與數據庫保持同步。
脫管對象與臨時對象的區別:
? ? ? 前者是由持久化對象轉變過來的,因此可能在數據庫中還存在對應的記錄,而后者在數據庫中沒有對應的記錄
當調用Session的close()方法時,Session的緩存被清空,緩存中的所有持久化對象都變為游離對象。如果在應用程序中沒有引用變量引用這些游離對象,它們就會結束生命周期。
總結:
臨時對象-----(get,load等)------>持久對象------(close方法關閉session)------>脫管對象
臨時對象:不在session緩存,沒記錄,get,load轉變持久對象
持久對象:在session緩存,有記錄
脫管對象:不在session緩存,可能有記錄,有數據庫標識,可通過update,saveOrUpdate等,轉變持久對象。
總結
以上是生活随笔為你收集整理的hibernate中的PO持久化对象及PO三种状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate.cfg.xml配置文
- 下一篇: hibernate的Configurat