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的這種機制,叫做懶加載
persist與save的方法的區別:
如果沒有開啓事務,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;如果爲0或null則表示未保存,是非持久狀
態,我們也可以指定unsave-value的值,比如可以指定當unsave-value=-1的時候表示未保存。
對象狀態轉換解析圖: