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ò)以下步驟:
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:
映射文件指定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)步。
更多建議: