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