<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    【永恒的瞬間】
    ?Give me hapy ?

    當應用程序通過new語句創建了一個對象,這個對象的生命周期就開始了,當不再有任何引用變量引用它,這個對象就結束生命周期,它占用的內存就可以被JVM的垃圾回收器回收。對于需要被持久化的Java對象,在它的生命周期中,可處于以下三個狀態之一:

    (1) 臨時狀態(transient):剛剛用new語句創建,還沒有被持久化,不處于Session的緩存中。處于臨時狀態的Java對象被稱為臨時對象。
    (2) 持久化狀態(persistent):已經被持久化,加入到Session的緩存中。處于持久化狀態的Java對象被稱為持久化對象。
    (3) 游離狀態(detached):已經被持久化,但不再處于Session的緩存中。處于游離狀態的Java對象被稱為游離對象。

    圖1為Java對象的完整狀態轉換圖,Session的特定方法觸發Java對象由一個狀態轉換到另一個狀態。從圖1看出,當Java對象處于臨時狀態或游離狀態,只要不被任何變量引用,就會結束生命周期,它占用的內存就可以被JVM的垃圾回收器回收;當處于持久化狀態,由于Session的緩存會引用它,因此它始終處于生命周期中。


    臨時對象的特征

    臨時對象具有以下特征:
    (1) 不處于Session的緩存中,也可以說,不被任何一個Session實例關聯。
    (2) 在數據庫中沒有對應的記錄。

    在以下情況下,Java對象進入臨時狀態:
    (1) 當通過new語句剛創建了一個Java對象,它處于臨時狀態,此時不和數據庫中的任何記錄對應。
    (2) Session的delete()方法能使一個持久化對象或游離對象轉變為臨時對象。對于游離對象,delete()方法從數據庫中刪除與它對應的記錄;對于持久化對象,delete()方法從數據庫中刪除與它對應的記錄,并且把它從Session的緩存中刪除。

    持久化對象的特征

    持久化對象具有以下特征:
    (1) 位于一個Session實例的緩存中,也可以說,持久化對象總是被一個Session實例關聯。
    (2) 持久化對象和數據庫中的相關記錄對應。
    (3) Session在清理緩存時,會根據持久化對象的屬性變化,來同步更新數據庫。

    Session的許多方法都能夠觸發Java對象進入持久化狀態:
    (1) Session的save()方法把臨時對象轉變為持久化對象。
    (2) Session的load()或get()方法返回的對象總是處于持久化狀態。
    (3) Session的find()方法返回的List集合中存放的都是持久化對象。
    (4) Session的update()、saveOrUpdate()和lock()方法使游離對象轉變為持久化對象。(nate注:根據hibernate reference的說法當試圖用update更新一個持久化對象時會拋異常)
    (5)當一個持久化對象關聯一個臨時對象,在允許級聯保存的情況下,Session在清理緩存時會把這個臨時對象也轉變為持久化對象。

    Hibernate保證在同一個Session實例的緩存中,數據庫表中的每條記錄只對應惟一的持久化對象。例如對于以下代碼,共創建了兩個Session實例:session1和session2。session1和session2擁有各自的緩存。在session1的緩存中,只會有惟一的OID為1的Customer持久化對象,在session2的緩存中,也只會有惟一的OID為1的Customer持久化對象。因此在內存中共有兩個Customer持久化對象,一個屬于session1的緩存,一個屬于session2的緩存。引用變量a和b都引用session1緩存中的Customer持久化對象,而引用變量c引用session2緩存中的Customer持久化對象:

    Session session1=sessionFactory.openSession();
    Session session2=sessionFactory.openSession();
    Transaction tx1 = session1.beginTransaction();
    Transaction tx2 = session2.beginTransaction();

    Customer a=(Customer)session1.load(Customer.class,new Long(1));
    Customer b=(Customer)session1.load(Customer.class,new Long(1));
    Customer c=(Customer)session2.load(Customer.class,new Long(1));

    System.out.println(a= =b); //true
    System.out.println(a= =c); //false

    tx1.commit();
    tx2.commit();
    session1.close();
    session2.close();

    Java對象的持久化狀態是相對于某個具體的Session實例的,以下代碼試圖使一個Java對象同時被兩個Session實例關聯:

    Session session1=sessionFactory.openSession();
    Session session2=sessionFactory.openSession();
    Transaction tx1 = session1.beginTransaction();
    Transaction tx2 = session2.beginTransaction();

    Customer c=(Customer)session1.load(Customer.class,new Long(1)); //Customer對象被session1關聯
    session2.update(c); //Customer對象被session2關聯
    c.setName("Jack"); //修改Customer對象的屬性

    tx1.commit(); //執行update語句
    tx2.commit(); //執行update語句
    session1.close();
    session2.close();

    當執行session1的load()方法時,OID為1的Customer對象被加入到session1的緩存中,因此它是session1的持久化對象,此時它還沒有被session2關聯,因此相對于session2,它處于游離狀態。當執行session2的update()方法時,Customer對象被加入到session2的緩存中,因此也成為session2的持久化對象。接下來修改Customer對象的name屬性,會導致兩個Session實例在清理各自的緩存時,都執行相同的update語句:

    update CUSTOMERS set NAME='Jack' …… where ID=1;
    在實際應用程序中,應該避免一個Java對象同時被多個Session實例關聯,因為這會導致重復執行SQL語句,并且極容易出現一些并發問題。

    ?游離對象的特征

    游離對象具有以下特征:
    (1) 不再位于Session的緩存中,也可以說,游離對象不被Session關聯。
    (2) 游離對象是由持久化對象轉變過來的,因此在數據庫中可能還存在與它對應的記錄(前提條件是沒有其他程序刪除了這條記錄)。

    游離對象與臨時對象的相同之處在于,兩者都不被Session關聯,因此Hibernate不會保證它們的屬性變化與數據庫保持同步。游離對象與臨時對象的區別在于:前者是由持久化對象轉變過來的,因此可能在數據庫中還存在對應的記錄,而后者在數據庫中沒有對應的記錄。

    Session的以下方法使持久化對象轉變為游離對象:
    (1) 當調用Session的close()方法時,Session的緩存被清空,緩存中的所有持久化對象都變為游離對象。如果在應用程序中沒有引用變量引用這些游離對象,它們就會結束生命周期。
    (2)Session的evict()方法能夠從緩存中刪除一個持久化對象,使它變為游離狀態。當Session的緩存中保存了大量的持久化對象,會消耗許多內存空間,為了提高性能,可以考慮調用evict()方法,從緩存中刪除一些持久化對象。但是多數情況下不推薦使用evict()方法,而應該通過查詢語言,或者顯式的導航來控制對象圖的深度。

    posted on 2007-02-07 08:43 ???MengChuChen 閱讀(182) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费黄色app网站| 亚洲毛片免费观看| 免费中文字幕在线观看| 亚洲剧情在线观看| 国产精彩免费视频| 亚洲av无码片区一区二区三区| 久久久久久国产精品免费免费男同 | 午夜免费福利在线观看| 97se亚洲国产综合自在线| 91在线视频免费看| 亚洲熟女综合一区二区三区| 黄页网站免费观看| 亚洲av无码专区在线观看亚| 国产性生交xxxxx免费| 男女交性无遮挡免费视频| 亚洲精品亚洲人成在线观看下载| 国产免费MV大全视频网站 | 人人狠狠综合久久亚洲88| 国内精品一级毛片免费看| 久久精品国产亚洲AV香蕉| 99久久99久久精品免费看蜜桃 | 免费看污成人午夜网站| 亚洲熟妇av午夜无码不卡| 国产国产成年年人免费看片| 人妖系列免费网站观看| 亚洲AV无码乱码在线观看裸奔| 100部毛片免费全部播放完整| 亚洲欧美日韩中文高清www777| 日本免费一本天堂在线| 4hu四虎免费影院www| 久久亚洲中文字幕精品有坂深雪 | 成人影片一区免费观看| 久久久久亚洲精品日久生情| 成年女人免费视频播放77777| 国产精品亚洲а∨无码播放不卡 | 久久久久久久亚洲精品| 99精品视频免费在线观看| 亚洲欧美中文日韩视频| 亚洲综合伊人久久综合| 国产成人免费午夜在线观看 | 国产亚洲精品美女久久久久|