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

劉水鏡發表於2014-02-19

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()方法雖然看起來是一個很簡單的方法,但是需要注意這些細小的地方,否則很容易出一些問題。一句話:學習框架的原理很重要,要想理解框架的原理,最直接的辦法就是看原始碼。


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




相關文章