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