1. 程式人生 > >hibernate三種狀態

hibernate三種狀態

   最初學習hibernate三種狀態時,聽的有些似懂非懂,之後的逐漸理解,對它慢慢有了自己的理解,並且通過一個小例子更是能對這三種狀態更加清晰。以下是我的總結。

1hibernate三種狀態

Transient(臨時狀態)new出來的物件;它沒有持久化,不存在於Session中——此狀態中的物件為臨時物件。
Persistent(持久化狀態)已經持久化,存在於Session快取中;如經hibernate語句save()儲存的物件——此狀態物件為持久物件。
Detached(遊離狀態)持久化物件脫離了Session後的物件。如Session快取被清空後的物件。已經持久化,單不存在於Session
中——此狀態中的物件為遊離物件。

2,三種狀態的區分:

1)物件有沒有Id——如果沒有Id,一定是Transient狀態
2Id在資料庫中有沒有
3)在記憶體中有沒有(session快取)
Transient:只是new出來一個物件,快取和資料庫中都沒有Id
Persistent:記憶體中有,快取中有,資料庫有(Id);
Detached:記憶體有,快取沒有,資料庫有 id

3,例子:


程式碼狀態解釋:建立一個Teacher物件,此時記憶體中有了這個物件,但是沒有Id,快取中也沒有,為Transient狀態;將Teacher物件通過save()方法儲存到資料庫之後,在Session快取裡就有了這個物件
(快取了這個獨享的Id,由這個Id指向它),並且資料庫也有了此物件(Id),為Persistent狀態;Session物件關閉,Teacher物件在記憶體中依舊存在,Session快取中不再存在,為Detached物件。

4Transient(臨時)物件與Detached(遊離)物件的異同之處:

兩者都不會被Session關聯,物件屬性和資料庫可能不一致;
遊離物件是由持久化物件關閉Session而轉化來的,在記憶體中還有物件,所以此時就變成遊離狀態了;

5,總結

以下內容為轉載內容
Hibernate和SQL的關係:
在操作了hibernate的方法如save()等後,並沒有直接生成sql語句,去操作資料庫,而是把這些更新存入Session中,只有Session快取要被更新時,底層的sql語句才能執行,資料存入資料庫;
下面舉例說明:
一,Session.save(user)執行機理。
1,把User物件加入快取中,使它變成持久化物件;
2,選用對映檔案指定的標識生成ID;
3,在Session清理快取時候執行:在底層生成一個insert sql語句,把物件存入資料庫;
注意:在你執行Session.save(user)後,在Session清理快取前,如果你修改user物件屬性值,那麼最終存入資料庫的值將是最後修改的值;此過程中ID不能被修改;
二,Session.delete(user)執行過程。
如果user是持久化物件,則執行刪除操作,同樣底層資料庫的執行條件是:在Session清理快取時候;
如果user是遊離物件:
1,將user物件和Session關聯,使之成為持久化物件;
2,然後按照user 是持久化物件的過程執行;