菜鳥學SSH(九)——Hibernate——Session之save()方法


Session的save()方法用來將一個臨時對象轉變為持久化對象,也就是將一個新的實體保存到數據庫中。通過save()將持久化對象保存到數據庫需要經過以下步驟:

1,系統根據指定的ID生成策略,為臨時對象生成一個唯一的OID;

2,將臨時對象加載到緩存中,使之變成持久化對象;

3,提交事務時,清理緩存,利用持久化對象包含的信息生成insert語句,將持久化對象保存到數據庫。


OK,下面來看一個實例:

 

        //創建SessionFactory
        Configuration config = new Configuration();
        ServiceRegistry  sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();  
        SessionFactory sessionFactory = config.buildSessionFactory(sr); 
        
        //打開Session
        Session session = sessionFactory.openSession();
        
        //開啟事務
        Transaction tx = session.beginTransaction();
        
        //創建臨時對象並賦值
        User user = new User();
        user.setId("1");
        user.setUserName("lsj");
        session.save(user);
        
        //提交事務
        tx.commit();
        
        //關閉Session
        session.close();

 


PS:

1,從Hibernate 4之后,Configuration類中,原先常用的,獲取SessionFactory的方法buildSessionFactory()被標記為過時,官方建議使用buildSessionFactory(ServiceRegistry sr)這個方法來獲取SessionFactory。

2,如果映射文件中為對象的ID指定了生成策略,那么在程序中為其ID賦值是無效的。會被系統自動生成的值覆蓋,例如:

 


映射文件指定ID生成策略由Hibernate控制自增:

 

        <id name="id" type="string">
            <generator class="increment">
        </id>

 


然后程序中進行如下操作:

 

        user.setId("1");
        System.out.println("手動賦值為:"+user.getId());
        session.save(user);
        System.out.println("存入數據庫的值為:"+user.getId());

 


這樣,最終存入數據庫的ID是Hibernate自動生成的自增ID,而不是我們手動給的值。

 

另外,執行save()方法時並不會將對象存入數據庫,在提交事務時,對象才被真正的保存到數據庫中。save()方法是將對象保存到Session的緩存中,提交事務時,Hibernate會生成相應的insert語句,將對象保存到數據庫。


再跟大家說一點需要注意的地方,Hibernate在提交事務的時候,會將之前對對象做的操作一並提交。就算是在save()方法之后做的操作也一樣。什么意思呢?我們看下面的例子:

 

        user.setUserName("old");
        session.save(user);
        user.setUserName("new");
        tx.commit();

 


執行以上操作,最終user.getUserName();得到的值將會是“new”,而不會是“old”,因為Hibernate在提交事務的時候把對user對象的所有操作都提交了。

 


OK,今天就到這里,save()方法雖然看起來是一個很簡單的方法,但是需要注意這些細小的地方,否則很容易出一些問題。一句話:學習框架的原理很重要,要想理解框架的原理,最直接的辦法就是看源碼。


每天學一點,每天進步一點。祝大家每天進步。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM