Hibernate幾個易混淆方法解析及對象狀態解析

load方法和get方法的區別:

舉例說明:

User user=session.load(User.class,1);

其一:

此時,load方法並不會執行,而是要等到user對象第一次被使用到的時候纔會執行load方法

比如,我現在寫一條打印語句:

System.out.println(user.getClass().getName());

此時,load方法將會執行

其二:

load方法得到的返回值永遠都不會爲空,即時在你的數據庫中並沒有你所查找的數據

因爲,load內部會自動new了一個繼承於User的子類的對象,所以,對load的返回值做判空操作是多餘的。

我們可以通過:

System.out.println(user.getClass().getName());來查看返回值的類型。

比如,我測試:

 

UserPojo user = (UserPojo) session.load(UserPojo.class, 1);

System.out.println("返回值類型:"+user.getClass().getName());

 

得到的一個結果爲:

返回值類型:cn.com.pojo.UserPojo$$EnhancerByCGLIB$$efc4150e

 

我們將load的這種機制,叫做懶加載

 

persistsave的方法的區別:

如果沒有開啓事務,save方法會執行插入語句,然後回滾;而persist根本就不會執行插入語句。

 

Hibernate中,存在三種狀態的對象:

瞬時狀態(transient):數據庫中沒有數據與之對應,超過作用域會被JVM垃圾回收期回收,一般是new出來

 

且與session沒有關聯的對象。

持久狀態(persistent):數據庫中有數據與之對應,當前與session有關聯,並且相關聯的session沒有關閉

 

,事務沒有提交:持久對象狀態發生該改變,在事務提交時會影響到數據庫(Hibernate能夠檢測到)

脫管狀態(detached):數據庫中有數據與之對應,但當沒有session與之關聯;託管對對象狀態發生改變,

 

Hibernate不能檢測到。

 

 

所以對於持久狀態的對象,我們想要跟新起對應的數據庫中的數據,無需調用update方法,直接修改對象屬性

 

,即可被Hibernate檢測到,自動的會生成跟新語句,但這時候並不會立刻執行,而是等到提交的時候在並執

 

行。

所以可以說,update方法是用來操作脫管狀態對象的,而insert方法是用來操作瞬時狀態對象的。

 

當我們無法確定一個對象是處於何種狀態,這時候,可以調用saveOrUpdate方法,由Hibernate自動判斷狀態

 

,執行相應的方法。Hibernate是通過配置文件中,主鍵id元素的屬性unsave-value來判斷的,如果是整形,

 

unsave-value默認值爲0,如果是String類型,則默認值爲null;如果爲0null則表示未保存,是非持久狀

 

態,我們也可以指定unsave-value的值,比如可以指定當unsave-value=-1的時候表示未保存。

 

對象狀態轉換解析圖:

 

 

發佈了5 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章