Hibernate持久化對象的狀態,hibernate對象
1. 站在持久化的角度 , Hibernate 把對象分為 4 種狀態 : 持久化狀態, 臨時狀態, 游離狀態(脫管狀態) , 刪除狀態.Session 的特定方法能使對象從一個狀態轉換到另一個狀態 .
2. 臨時狀態(Transient) : 1). 在使用代理主鍵的情況下 , OID 通常為 null 2). 不處於 Session 的緩衝中 3). 在資料庫中沒有對應的記錄
3. 持久化狀態(也叫”託管” )( Persist)
1). OID 不為 null 2). 位於 Session 緩衝中 3). 若在資料庫中已經有和其對應的記錄 , 持久化對象和資料庫中的相關記錄對應 4). Session 在 flush 緩衝時 , 會根據持久化對象的屬性變化 , 來同步更新資料庫 5). 在同一個 Session 執行個體的緩衝中 , 資料庫表中的每條記錄只對應唯一的持久化對象( Session 緩衝對象的 OID 不能重複)
@Test public void testOID(){ News news2 = (News ) session.get (News.class , 1); System.out.println (news2 ); News news = new News (); news.setAuthor ("Oracle2" ); news.setContent ("Oracle DB" ); news.setDate (new Date ()); news.setTitle ("DB" ); news.setId (1 ); //拋出異常: org.hibernate.NonUniqueObjectException session.update (news ); }
4. 游離狀態(也叫”脫管” ) (Detached ): 1). OID 不為 null 2). 不再處於 Session 緩衝中 3). 一般情況需下 , 游離對象是由持久化對象轉變過來的 , 因此在資料庫中可能還存在與它對應的記錄
5. 刪除狀態(Removed) 1). 在資料庫中沒有和其 OID 對應的記錄 2). 不再處於 Session 緩衝中 3). 一般情況下 , 應用程式不該再使用被刪除的對象
6. 狀態的轉換圖
7. get & load 的區別: 共同點: get、load 從資料表中載入一個對象 , 載入後即為持久化狀態的對象 不同點: get: 立即查詢資料表. 若沒有對應的記錄 , 返回 null ; load: 延遲查詢資料表 . 直到第一次使用該對象時 , 再進行查詢, 先返回的是一個代理對象 . 若沒有對應的記錄 ,並且使用了該對象 , 則會拋出org.hibernate.ObjectNotFoundException 異常
8. update 方法:
@Test public void testUpdate(){ News news = (News ) session.get (News.class , 1); System.out.println (news ); transaction.commit (); session.clear (); session = sessionFactory.openSession (); transaction = session.beginTransaction (); //此時對象為游離狀態 news.setAuthor ("Oracle" ); //update 可以使游離對象變為持久化對象 . //通常需要發送一條 UPDATE 語句 //若對象即為持久化對象 , 則不需要調用 update() 方法 session.update (news ); }
注意:1) . 使用情境: B\S 項目中從頁面傳過來一個對象,需要對其進行更新時,即調用 update()方法2) . 若資料表中沒有對象對應的記錄,還要執行 update() 方法,則會拋出異常: org.hibernate.StaleObjectStateException
9. saveOrUpdate (): 儲存或更新
11. delete ():刪除一個對象對應的記錄。 1). 若只想刪除指定的對象,設定 ID 即可。 2). 若資料表中沒有對應的記錄,則拋出異常: java.lang.IllegalArgumentException
12. Hibernate 調用原生的 JDBC API:
session.doWork(new Work() { @Override public void execute(Connection connection ) throws SQLException { //使用 JDBC 原生的 API } });
hibernate的對象的三種持久化狀態,並給出解釋?
瞬時態:簡單的說就是你在程式裡面new一個對象,還沒有和session關聯
持久態:對象和session有了關聯,對象處於hibernate架構管理中
游離態:在持久態的情況下,對象和session失去了關聯,比如session.close()或session.flush()
後,即游離態,但資料已經儲存到了資料庫
hibernate的持久化
你的理解反了,持久化顧名思義就是把緩衝中的東西放到資料庫中使之持久.對於需要持久化的對象,它的生命週期分為三個狀態:臨時狀態,持久化狀態,游離狀態.
臨時狀態:剛剛用new語句建立,沒有被持久化,不處於session的緩衝中.處於臨時狀態的java對象被稱為臨時對象.
持久化狀態:已經被持久化,加入到session的緩衝中.處於持久化的java對象被稱為持久化對象.
游離狀態:已經被持久化,但不處於session的緩衝中,處於游離狀態的java對象被成為游離對象.
持久化對象的特徵:
. 位於一個session案例的緩衝中,可以說持久化對象總是被一個session案例關聯
. 持久化對象和資料庫中的相關記錄對應
. Session在清理緩衝時,會根據持久化對象的屬性變化來同步更新資料庫
. Session的save()方法把臨時狀態變為持久化狀態.
. Session的update() ,saveOrUpdate()和lock()方法使游離狀態變為持久化狀態.