Hibernate持久化對象的狀態,hibernate對象

來源:互聯網
上載者:User

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 ();             //拋出異常: 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()方法使游離狀態變為持久化狀態.
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.