這篇文章將為大家詳細講解有關(guān)Hibernate中Session增刪改查的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、嵩縣網(wǎng)站維護、網(wǎng)站推廣。
把三狀態(tài)轉(zhuǎn)換圖放在這,方便分析方法的作用:
1.Session的save()方法
Session是Hibernate所有接口中最重要的接口,提供了對數(shù)據(jù)保存,更新,查詢和刪除的方法。
Session的save()方法可以使臨時態(tài)或游離態(tài)轉(zhuǎn)換為持久態(tài)。例如,保存一個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.調(diào)用Session的save()方法,將Customer對象持久化 session.save(c1); tr.commit(); session.close();
Save()方法主要做了以下三件事:
(1)將new創(chuàng)建的臨時態(tài)的Customer對象放入緩存,使其持久化。
(2)同時根據(jù)對象關(guān)系映射文件中設(shè)置的OID生成器,即主鍵生成方式給該對象生成一個唯一的OID。
<!--設(shè)置主鍵--> <idname="id"column="ID"type="long"> <!--主鍵生成方式--> <generatorclass="increment"/> </id>
在這個地方有一個疑問,創(chuàng)建對象時setId()方法是否是為該對象持久化生成主鍵,其實不是,setId并沒有按照我們設(shè)定的那樣生成主鍵,而是靠對象關(guān)系映射文件配置的主鍵生成方式生成主鍵,可以多運行幾次,主鍵自增長,從數(shù)據(jù)庫可以看到多條數(shù)據(jù),主鍵從1開始,所以可以知道setId()
沒有設(shè)置主鍵,否則數(shù)據(jù)庫主鍵唯一性校驗都過不去。
我們也可以手動設(shè)置主鍵值,必須重載save()方法,使用重載方法save(c1,newLong(1)),每次手動設(shè)置。
(3)計劃執(zhí)行insert語句。注意,insert語句并沒有立刻執(zhí)行,只有當Session清理緩存時,才會執(zhí)行insert語句。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.調(diào)用Session的save()方法,將Customer對象持久化 session1.save(c1); tr1.commit(); session1.close(); //3.將游離態(tài)的對象更新,發(fā)現(xiàn)改變,執(zhí)行update語句 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)執(zhí)行update語句。跟save()執(zhí)行insert語句一樣,并不是立刻執(zhí)行update語句,需要等緩存清空時,把Customer對象組裝成update語句,
然后再執(zhí)行。
注意,即使Customer沒有改變,默認情況下,緩存清除時也會組裝Update語句,如果需要設(shè)置成改變成才執(zhí)行update語句,需要設(shè)置對象關(guān)系映射文件。
3.Session的saveOrUpdate()方法
saveOrUpdate()方法包含save()和update()方法的功能,根據(jù)傳入?yún)?shù)狀態(tài),調(diào)用不同方法。傳入臨時態(tài)對象調(diào)用save()方法,如果傳入游離態(tài)對象調(diào)用
update()方法。傳入持久態(tài)對象返回。所以,每次我們只需傳入對象,saveOrUpdate()方法,自動判斷傳入對象狀態(tài)的狀態(tài),動態(tài)調(diào)用處理方法。
該方法如何判斷傳入對象的狀態(tài)?當滿足以下任意一個條件時,就是臨時態(tài):
(1)java對象的OID為null,說明該對象沒有別實例化,即使被實例化,也是游離態(tài)被刪除后變成臨時態(tài)的對象,這種情況下的對象為臨時態(tài)。
(2)如果java對象具有版本控制(version),版本號為null的,也就是沒有該對象的版本號。
(3)自定義攔截器,調(diào)用isUnsaved()返回值為true。
4.Session的load()和get()方法
這兩個方法都是根據(jù)OID,從數(shù)據(jù)庫中加載一個持久化對象。持久化對象放在Session緩存中,可以根據(jù)不同的需要操作該持久化對象。
兩者區(qū)別:
當數(shù)據(jù)庫中OID沒有對應(yīng)記錄時,load()拋異常,get()返回null。
5.Session的delete()方法
delete()顧名思義刪除,用于從數(shù)據(jù)庫中刪除java對象對應(yīng)的記錄。
delete()如果傳入持久化對象,組裝delete語句,執(zhí)行刪除;如果傳入游離態(tài)對象,hibernate先把游離態(tài)關(guān)聯(lián)到session,變成持久態(tài),再生成delete語句,
執(zhí)行刪除。
都是只有當session緩存清空時,才執(zhí)行。
以上執(zhí)行都是一個對象,對應(yīng)一條記錄。
可以用session.delete("fromCustomerwhere....");后面加上條件刪除多條數(shù)據(jù)。
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.調(diào)用Session的save()方法,將Customer對象持久化 session1.save(c1); tr1.commit(); session1.close(); //3.將游離態(tài)的對象關(guān)聯(lián)到session,持久化后清除緩存,執(zhí)行delete語句;放入持久態(tài)的直接刪除; Session session2 = sessionFactory.openSession(); Transaction tr2 = session2.beginTransaction(); session2.delete(c1); tr2.commit(); session2.close();
執(zhí)行結(jié)果,控制臺輸出:
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=?
關(guān)于“Hibernate中Session增刪改查的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
分享文章:Hibernate中Session增刪改查的示例分析
分享地址:http://www.chinadenli.net/article22/ighecc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、網(wǎng)站改版、定制網(wǎng)站、服務(wù)器托管、網(wǎng)站排名、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)