SSH Hibernate——Session之save()方法

2018-09-28 18:58 更新

Hibernate——Session之save()方法

Session的save()方法用來(lái)將一個(gè)臨時(shí)對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象,也就是將一個(gè)新的實(shí)體保存到數(shù)據(jù)庫(kù)中。通過(guò)save()將持久化對(duì)象保存到數(shù)據(jù)庫(kù)需要經(jīng)過(guò)以下步驟:

  • 1系統(tǒng)根據(jù)指定的ID生成策略,為臨時(shí)對(duì)象生成一個(gè)唯一的OID;
  • 2將臨時(shí)對(duì)象加載到緩存中,使之變成持久化對(duì)象;
  • 3提交事務(wù)時(shí),清理緩存,利用持久化對(duì)象包含的信息生成insert語(yǔ)句,將持久化對(duì)象保存到數(shù)據(jù)庫(kù)。

OK,下面來(lái)看一個(gè)實(shí)例:

//創(chuàng)建SessionFactory  
Configuration config = new Configuration();  
ServiceRegistry  sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();    
SessionFactory sessionFactory = config.buildSessionFactory(sr);   

//打開(kāi)Session  
Session session = sessionFactory.openSession();  

//開(kāi)啟事務(wù)  
Transaction tx = session.beginTransaction();  

//創(chuàng)建臨時(shí)對(duì)象并賦值  
User user = new User();  
user.setId("1");  
user.setUserName("lsj");  
session.save(user);  

//提交事務(wù)  
tx.commit();  

//關(guān)閉Session  
session.close();  

PS:

  • 1從Hibernate 4之后,Configuration類中,原先常用的,獲取SessionFactory的方法buildSessionFactory()被標(biāo)記為過(guò)時(shí),官方建議使用buildSessionFactory(ServiceRegistry sr)這個(gè)方法來(lái)獲取SessionFactory。
  • 2如果映射文件中為對(duì)象的ID指定了生成策略,那么在程序中為其ID賦值是無(wú)效的。會(huì)被系統(tǒng)自動(dòng)生成的值覆蓋,例如:

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

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

然后程序中進(jìn)行如下操作:

user.setId("1");  
System.out.println("手動(dòng)賦值為:"+user.getId());  
session.save(user);  
System.out.println("存入數(shù)據(jù)庫(kù)的值為:"+user.getId());  

這樣,最終存入數(shù)據(jù)庫(kù)的ID是Hibernate自動(dòng)生成的自增ID,而不是我們手動(dòng)給的值。另外,執(zhí)行save()方法時(shí)并不會(huì)將對(duì)象存入數(shù)據(jù)庫(kù),在提交事務(wù)時(shí),對(duì)象才被真正的保存到數(shù)據(jù)庫(kù)中。save()方法是將對(duì)象保存到Session的緩存中,提交事務(wù)時(shí),Hibernate會(huì)生成相應(yīng)的insert語(yǔ)句,將對(duì)象保存到數(shù)據(jù)庫(kù)。

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

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

執(zhí)行以上操作,最終user.getUserName();得到的值將會(huì)是“new”,而不會(huì)是“old”,因?yàn)镠ibernate在提交事務(wù)的時(shí)候把對(duì)user對(duì)象的所有操作都提交了。

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

每天學(xué)一點(diǎn),每天進(jìn)步一點(diǎn)。祝大家每天進(jìn)步。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)