<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 簡介 Hibernate為了更好管理持久化類,將持久化類分成三種狀態. **分別是瞬時狀態,持久態,托管態** **Hb框架使用cglib代理生成代理對象.代理對象是繼承被代理對象.如果被final修飾就無法使用** # 瞬時狀態(transient) 臨時態或者自由態,瞬時態的實例是由new命令創建,開辟內存空間的對象, **不存在持久化標識OID(相當于主鍵值),尚未與`hibernate Session`關聯.** **在數據庫中沒有記錄,失去引用會被JVM回收.** 在內存中是孤立的,在數據庫中的數據無任何關聯,僅是一個信息攜帶的載體 # 持久態(persistent) **存在持久化標識OID,加入到Session緩存中,并且相關聯的Session沒有關閉,在數據庫中有對應的記錄.** 每條記錄只對應唯一的持久化對象,需要注意的是,持久化對象是在事務還沒提交前變為持久態的 oid就是數據庫主鍵 用hb,表必須有主鍵,沒有主鍵就用不了 # 托管態(detached) 托管態也叫離線態或者游離態,當某個持久態狀態實例與session的關聯被關閉就變成托管態. **托管態存在持久化表示OID,并且仍然與數據庫中的數據存在關聯,只是失去了與當前session的關聯,托管狀態對象發生改變時Hibernate不能檢測到** # 區分對象的三種狀態 customer對象由new關鍵字創建,此時還未與session關聯,他的狀態稱為瞬時態. 在執行了`session.save(customer);`操作后, 對象納入了session的管理范圍. 這時customer對象變成了持久態對象,此時session的事務還沒有被提交. 程序執行完commit()操作并關閉了session后,customer對象與session的關聯被關閉,此時customer對象變成了托管態 ~~~ @Test public void fun2() { Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); // 瞬時狀態沒有持久化表示oid,沒有被session管理 Customer customer = new Customer(); customer.setCust_name("老王"); // 持久化對象:有持久化表示oid,被session管理 Serializable id = session.save(customer); tx.commit(); session.close(); // 托管狀態,有持久化表示oid,沒有被session管理 System.out.println(customer); } ~~~ # 轉換 new對象是瞬時態,當執行Session的save()或者saveOrUpdate()方法后, 該對象將被放入session的一級緩存,對象進入持久態. 當進入持久態的對象執行evict(),close()或者clear()操作后,對象進入托管態. 當直接執行session的get(),load(),find()或者iterate()等方法從數據庫里查詢對象時,查詢到的對象也處于持久態. 當對數據庫中的記錄進行update(),saveOrUpdate()以及lock()等操作后,此時托管態的對象就過渡到持久態. 由于瞬時態和托管態不在session管理范圍內,會被jvm回收 ![](https://img.kancloud.cn/c3/89/c389be9fd4d7553bd533fcee585546a0_616x398.png) 1. 瞬時態轉換到其他狀態 * 瞬時態轉換為持久態:執行 Session的 save或 saveOrUpdateO方法。 * 瞬時態轉換為托管態:為瞬時態對象設置持久化標識OD。 由于持久化對象狀態演化圖中沒有涉及到瞬時態轉換到脫管態的情況,這里做下簡要的說明, 脫管態對象存在OD,但是沒有 Session的關聯,也就是說脫管態和瞬時態的區別就是oD有沒有值,所以可以通過為瞬時態對象設置OD,使其變成脫管態對象。 ~~~ Customer customer= new Customer();//瞬時態 customer setCust id(1); //脫管態 ~~~ 2. 持久態對象轉換到其他狀態 持久化對象可以直接通過 Hibernate中 Session的get()、 load()方法,或者 Query查詢從數據庫 中獲得: * 持久態轉換為瞬時態:執行 Session的delete方法,需要注意的是被刪除的持久化對象,不 建議再次使用 * 持久態轉換為托管態:執行 Session的 evict、 closed或 clear方法。 evict()方法用于清除一 級緩存中某一個對象; close()方法用于關閉 Session,清除一級緩存; clear方法用于清除 級緩存的所有對象。 3. 脫管態對象轉換到其他狀態 脫管態對象無法直接獲得,是由其他狀態對象轉換而來的 * 脫管態轉換為持久態: 執行 Session的 update()、 saveOrUpdate()或 lock()方法。 * 脫管態轉換為瞬時態:將脫管態對象的持久化標識OD設置為null 由于持久化對象狀態演化圖中沒有涉及到脫管態轉換到瞬時態的情況,這里做下簡要的說明 跟瞬時態轉換到脫管態的情況相似,脫管態和瞬時態的區別就是OD有沒有值,所以可以通過將脫 管態對象的oD設置為null,使其變成瞬時態對象。例如在 session.close()操作后,加入代碼 `customer.setCust_id(null)`, customer對象將由脫管態轉換為瞬時態。 ## 總結 1. 瞬時態(new出來的) 瞬時--->持久 save, saveOrUpdat 瞬時--->脫管(游離)手動設置oid 2. 持久態它是由 session管理 ~~~ 持久--->瞬時 delete()被刪除后持久化對象不在建議使用 ~~~ ~~~ 持久--->脫管 注意 session它的緩存就是所說的一級緩存 evct(清除一級緩存中指定的一個對象 clear(清空一級緩存 cose(關閉,清空一級緩存) ~~~ 3. 脫管態(它是無法直接獲取) 脫管--->瞬時直接將oid刪除 脫管--->持久 `update, saveOrUpdate lock(過時)` ![](https://img.kancloud.cn/e0/6d/e06dbe927231e898e08f97d574addbe1_861x576.png) # 自動更新數據庫 其實我們主要去研究持久態對象就夠了, **持久態對象其實有一個非常重要的特性:持久態對象可以自動更新數據庫** ~~~ @Test //測試持久化類的持久態對象有自動更新數據庫的能力 public void demo2() { Session session= HibernateUtils.openSession(); Transaction tx session beginTransaction(); //獲得持久態的對象 Customer customer= session.get(Customer. class,1L);//持久態對象 customer.setCust_name("王五”) // session.update(customer);//不用手動調用update方法就可以更新 tx.commit(); session.close(); } ~~~ 執行測試我們會發現,我們并沒有手動調用update方法, Hibernate就可以將數據自動更新了。 持久態對象就有這樣的一個功能。 持久態對象之所以有這樣的功能其實都依賴了 Hibernate的一級緩存
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看