程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Hibernate中java對象的三種狀態,hibernatejava

Hibernate中java對象的三種狀態,hibernatejava

編輯:JAVA綜合教程

Hibernate中java對象的三種狀態,hibernatejava


  • 瞬時狀態(Transient)

  通過new創建對象後,對象並沒有立刻持久化,它並未與數據庫中的數據有任何關聯,此時Java對象的狀態為瞬時狀態。

  Session對於瞬時狀態的Java對象是一無所知的,當對象不再被其他對象引用時,它的所有數據也就丟失了,對象將會被Java虛擬機按照垃圾回收機制處理。

  • 持久狀態(Persistent)

  當對象與Session關聯,被Session管理時,它就處於持久狀態。處於持久狀態的對象擁有數據庫標識(數據庫中的主鍵值)。

  那麼,對象是什麼時候與Session發生關聯的呢?有兩種方法:

    第一種,通過Sesison的查詢接口,或者get()方法,或者load()方法從數據庫中加載對象的時候,加載的對象是與數據庫表中的一條記錄關聯的,此時對象與加載它的Session發生關聯;

    第二種,瞬時狀態的對象,通過Session的save()方法或SaveOrUpdate()方法時,Java對象也與Session發生關聯。

  對於處於持久狀態的對象,Session會持續跟蹤和管理它們,如果對象的內部狀態發生了任何變更,Hibernate會選擇合適的時機(如事務提交時)將變更固化到數據庫中。

  • 游離狀態

  處於持久狀態的對象,脫離與其關聯的nSession的管理後,對象就處於游離狀態。

  處於游離狀態的對象,Session無法保證對象所包含的數據與數據庫中的記錄一直,因為Hibernate已經無法感知對該對象的任何操作。

  Session提供了兩個方法(update()、merge()),將處於游離狀態的對象,與一個新的Session發生關聯。

  此時,對象的狀態就從游離狀態重新轉換為持久狀態。

2.三種狀態之間的轉換:

使用new關鍵字構件對象,該對象的狀態是瞬時狀態。

1 .瞬時狀態轉為持久狀態

  使用Session對象的save()或saveOrUpdate()方法保存對象後,該對象的狀態由瞬時狀態轉換為持久狀態。

  使用Session對象的get()或load()方法獲取對象,該對象的狀態是持久狀態。

2. 持久狀態轉為瞬時狀態

  執行Session對象的delete()方法後,對象由原來的持久狀態變為瞬時狀態,因為此時該對象沒有與任何的數據庫數據關聯。

3. 持久狀態轉為游離狀態

  執行了Session對象的evict()、clear()或close()方法,對象由原來的持久狀態轉為游離狀態。

4 .游離狀態轉為持久狀態

  重新獲取Session對象,執行Session對象的update()或saveOrUpdate()方法,對象由游離狀態轉為持久狀態,該對象再次與Session對象相關聯。

5. 游離狀態轉為瞬時狀態

  執行Session對象的delete()方法,對象由游離狀態轉為瞬時狀態。

  處於瞬時狀態或游離狀態的對象不再被其他對象引用時,會被Java虛擬機按照垃圾回收機制處理。

3.Hibernate中get()和load()區別

當使用Session的get()方法時,如果加載的數據不存在,get()方法會返回一個NULL;但是使用load()方法,若加載的數據不存在,則會拋出異常。

一.load加載方式

當使用load方法來得到一個對象時,此時hibernate會使用延遲加載的機制來加載這個對象,即:當我們使用session.load()方法來加載一個對象時,此時並不會發出sql語句,當前得到的這個對象其實是一個代理對象,這個代理對象只保存了實體對象的id值,只有當我們要使用這個對象,得到其它屬性時,這個時候才會發出sql語句,從數據庫中去查詢我們的對象。

 Session session = HibernateUtil.currentSession();
           Transaction tx=session.beginTransaction();
           Dept dept = (Dept)session.load(Dept.class,1);
           System.out.println(dept);
通過load的方式加載對象時,會使用延遲加載機制,此時得到的User對象其實是一個
代理對象,該代理對象裡面僅僅只有id這個屬性

二、get加載方式

相對於load的延遲加載方式,get就直接的多,當我們使用session.get()方法來得到一個對象時,不管我們使不使用這個對象,此時都會發出sql語句去從數據庫中查詢出來:

Session session = HibernateUtil.currentSession();
           Transaction tx=session.beginTransaction();
// 通過get方法來加載對象時,不管使不使用該對象,都會發出sql語句,
//從數據庫中查詢
           Dept dept = (Dept)session.get(Dept.class,1);
           System.out.println(dept);

因此我們可以看到,使用load的加載方式比get的加載方式性能要好一些,因為load加載時,得到的只是一個代理對象,當真正需要使用這個對象時再去從數據庫中查詢。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved