hibernate 深入理解持久化對象

hibernate 完全採用面向對象的方式來操作數據庫,因此開發者眼裏只有對象、屬性,無須理會數據庫、表、列等概念。

持久化類的要求

Hibernate 採用低侵入式設計,所以對持久化類的要求也是隻要是簡單的pojo即可。

雖然hibernate對持久化沒什麼要求,但應遵守如下規則:
-提供一個無參的構造器,這樣hibernate就可以使用Constructor.newInstance()來創建持久化實例了。
-提供 一個標識屬性,通常是映射數據庫的主鍵字段
-對象的屬性應儘量避免使用最基本的類型,如int 採用integer代替。
-爲持久化類的每個成員變量提供getter和setter方法。
-使用非final的類,在運行時生成代理是Hibernate的一個重要功能
-重寫equals和hashcode方法,如果需要把持久化類放入set中。

持久化對象的狀態

瞬態:對象由new操作符創建,且尚未與hibernate Session關聯的對象被 認爲處於瞬態。

持久化:持久化實例在數據庫中有對應的記錄,並擁有一個持久化標識identifier。在當前操作執行完成時將對象 數據寫回數據庫。開發者不需要手動執行update

脫管:某個實例曾經處於持久化狀態,但隨着與之關聯的Session被關閉,該對象將變成持久化狀態

持久化狀態演變圖

改變持久化對象狀態的方法

-Serializable save(object obj)將對象變爲持久化狀態
-void persist(object obj)將對象轉化爲持久化狀態
-Serializable save(object obj,object pk)將obj對象轉化爲持久化狀態,該對象保存到數據庫,指定主鍵值
-void persist(object obj,object pk) 也加了一個設定主鍵

save和persist方法的區別:使用save保存持久化對象時會返回 該 持久化對象的標識屬性值。這就可以用到下面的方法中

根據主鍵加載持久化實體

News n=sess.load(News.class,pk);

如果沒有匹配的數據庫記錄會拋出hibernateExpetion異常,如果在持久化類註解中指定了延遲加載,則load方法會返回 一個未初始化的代碼對象,但它並沒有加載數據 ,直到程序調用該對象的某個方法裏。hibernate纔會訪問數據庫

與load方法類似的是get方法,區別 就是get方法會立刻訪問數據庫,如果沒有對應的記錄,get方法會返回 Null,而不是返回一個代理對象。

更新持久化實體

    u.setUserName("123123123123");
    sess.flush();

更新託管實體

對於一個曾經持久化過,但已經了session管理 的持久化對象,被認爲處於脫管狀態,此時程序應該顯式的使用新的Session來保存修改。hibernate提供了三個方法update merge saveorupdate

當需要使用Update方法來更新修改時,如果不記得該對象是否持久化過,可以使用saveorupdate方法,如果持久化過會使用upate方法,否則是save方法。
merge方法與update方法功能相同 ,區別執行sess.merge(a)方法後,a對象不是持久化對象的狀態。而Update會把a變成持久化對象。


        Session sess = sf.openSession();
        org.hibernate.Transaction tx = sess.beginTransaction();
        User u=(User) sess.load(User.class, 2);
        System.out.println(u.getUserName());
        tx.commit();
        sess.close();



        Session sess2 = sf.openSession();
        org.hibernate.Transaction tx2 = sess2.beginTransaction();
        u.setUserName("15701602887");
        sess2.saveOrUpdate(u);
        tx2.commit();
        sf.close();

刪除持久化實體

直接使用

sess2.delete(u);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章