- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Hibernate中Session增刪改查的示例分析
這篇文章將為大家詳細講解有關(guān)Hibernate中Session增刪改查的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
把三狀態(tài)轉換圖放在這,方便分析方法的作用:
1.Session的save()方法
Session是Hibernate所有接口中最重要的接口,提供了對數據保存,更新,查詢(xún)和刪除的方法。
Session的save()方法可以使臨時(shí)態(tài)或游離態(tài)轉換為持久態(tài)。例如,保存一個(gè)Customer對象:
SessionFactory sessionFactory; Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction tr = session.beginTransaction(); //1.創(chuàng )建Customer對象 Customer c1 = new Customer(); c1.setId(new long(1)); c1.setName("test"); c1.setEmail("123456789@qq.com"); c1.setPassword("123456"); c1.setAddress("世外桃源"); //2.調用Session的save()方法,將Customer對象持久化 session.save(c1); tr.commit(); session.close();
Save()方法主要做了以下三件事:
(1)將new創(chuàng )建的臨時(shí)態(tài)的Customer對象放入緩存,使其持久化。
(2)同時(shí)根據對象關(guān)系映射文件中設置的OID生成器,即主鍵生成方式給該對象生成一個(gè)唯一的OID。
<!--設置主鍵--> <idname="id"column="ID"type="long"> <!--主鍵生成方式--> <generatorclass="increment"/> </id>
在這個(gè)地方有一個(gè)疑問(wèn),創(chuàng )建對象時(shí)setId()方法是否是為該對象持久化生成主鍵,其實(shí)不是,setId并沒(méi)有按照我們設定的那樣生成主鍵,而是靠對象關(guān)系映射文件配置的主鍵生成方式生成主鍵,可以多運行幾次,主鍵自增長(cháng),從數據庫可以看到多條數據,主鍵從1開(kāi)始,所以可以知道setId()
沒(méi)有設置主鍵,否則數據庫主鍵唯一性校驗都過(guò)不去。
我們也可以手動(dòng)設置主鍵值,必須重載save()方法,使用重載方法save(c1,newLong(1)),每次手動(dòng)設置。
(3)計劃執行insert語(yǔ)句。注意,insert語(yǔ)句并沒(méi)有立刻執行,只有當Session清理緩存時(shí),才會(huì )執行insert語(yǔ)句。tr.commit()事務(wù)提交。
2.Session的update()方法
使游離態(tài)對象變成持久態(tài)對象。例如:
SessionFactory sessionFactory; Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); Session session1 = sessionFactory.openSession(); Transaction tr1 = session1.beginTransaction(); //1.創(chuàng )建Customer對象 Customer c1 = new Customer(); c1.setId(new Long(1)); c1.setName("test"); c1.setEmail("123456789@qq.com"); c1.setPassword("123456"); c1.setAddress("世外桃源"); //2.調用Session的save()方法,將Customer對象持久化 session1.save(c1); tr1.commit(); session1.close(); //3.將游離態(tài)的對象更新,發(fā)現改變,執行update語(yǔ)句 Session session2 = sessionFactory.openSession(); Transaction tr2 = session2.beginTransaction(); c1.setAddress("測試update"); session2.update(c1); tr2.commit(); session2.close();
Session的update()注意做以下事:
(1)把游離態(tài)的Customer對象從新加入Session緩存中,使其變成持久化對象。
(2)執行update語(yǔ)句。跟save()執行insert語(yǔ)句一樣,并不是立刻執行update語(yǔ)句,需要等緩存清空時(shí),把Customer對象組裝成update語(yǔ)句,
然后再執行。
注意,即使Customer沒(méi)有改變,默認情況下,緩存清除時(shí)也會(huì )組裝Update語(yǔ)句,如果需要設置成改變成才執行update語(yǔ)句,需要設置對象關(guān)系映射文件。
3.Session的saveOrUpdate()方法
saveOrUpdate()方法包含save()和update()方法的功能,根據傳入參數狀態(tài),調用不同方法。傳入臨時(shí)態(tài)對象調用save()方法,如果傳入游離態(tài)對象調用
update()方法。傳入持久態(tài)對象返回。所以,每次我們只需傳入對象,saveOrUpdate()方法,自動(dòng)判斷傳入對象狀態(tài)的狀態(tài),動(dòng)態(tài)調用處理方法。
該方法如何判斷傳入對象的狀態(tài)?當滿(mǎn)足以下任意一個(gè)條件時(shí),就是臨時(shí)態(tài):
(1)java對象的OID為null,說(shuō)明該對象沒(méi)有別實(shí)例化,即使被實(shí)例化,也是游離態(tài)被刪除后變成臨時(shí)態(tài)的對象,這種情況下的對象為臨時(shí)態(tài)。
(2)如果java對象具有版本控制(version),版本號為null的,也就是沒(méi)有該對象的版本號。
(3)自定義攔截器,調用isUnsaved()返回值為true。
4.Session的load()和get()方法
這兩個(gè)方法都是根據OID,從數據庫中加載一個(gè)持久化對象。持久化對象放在Session緩存中,可以根據不同的需要操作該持久化對象。
兩者區別:
當數據庫中OID沒(méi)有對應記錄時(shí),load()拋異常,get()返回null。
5.Session的delete()方法
delete()顧名思義刪除,用于從數據庫中刪除java對象對應的記錄。
delete()如果傳入持久化對象,組裝delete語(yǔ)句,執行刪除;如果傳入游離態(tài)對象,hibernate先把游離態(tài)關(guān)聯(lián)到session,變成持久態(tài),再生成delete語(yǔ)句,
執行刪除。
都是只有當session緩存清空時(shí),才執行。
以上執行都是一個(gè)對象,對應一條記錄。
可以用session.delete("fromCustomerwhere....");后面加上條件刪除多條數據。
SessionFactory sessionFactory; Configuration configuration = new Configuration().configure(); sessionFactory = configuration.buildSessionFactory(); Session session1 = sessionFactory.openSession(); Transaction tr1 = session1.beginTransaction(); //1.創(chuàng )建Customer對象 Customer c1 = new Customer(); c1.setId(new Long(1)); c1.setName("test"); c1.setEmail("123456789@qq.com"); c1.setPassword("123456"); c1.setAddress("世外桃源"); //2.調用Session的save()方法,將Customer對象持久化 session1.save(c1); tr1.commit(); session1.close(); //3.將游離態(tài)的對象關(guān)聯(lián)到session,持久化后清除緩存,執行delete語(yǔ)句;放入持久態(tài)的直接刪除; Session session2 = sessionFactory.openSession(); Transaction tr2 = session2.beginTransaction(); session2.delete(c1); tr2.commit(); session2.close();
執行結果,控制臺輸出:
Hibernate: select max(ID) from CUSTOMERS
Hibernate: insert into CUSTOMERS (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, DESCRIPTION, IMAGE, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: delete from CUSTOMERS where ID=?
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站