最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Hibernate中Session增刪改查操作代碼詳解

 更新時(shí)間:2017年12月12日 08:39:42   作者:街燈下的小草  
這篇文章主要介紹了Hibernate中Session增刪改查操作代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。

把三狀態(tài)轉(zhuǎn)換圖放在這,方便分析方法的作用:

1.Session的save()方法

Session是Hibernate所有接口中最重要的接口,提供了對(duì)數(shù)據(jù)保存,更新,查詢和刪除的方法。

Session的save()方法可以使臨時(shí)態(tài)或游離態(tài)轉(zhuǎn)換為持久態(tài)。例如,保存一個(gè)Customer對(duì)象:

SessionFactory sessionFactory;
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tr = session.beginTransaction();
//1.創(chuàng)建Customer對(duì)象 
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對(duì)象持久化 
session.save(c1);
tr.commit();
session.close();

Save()方法主要做了以下三件事:

(1)將new創(chuàng)建的臨時(shí)態(tài)的Customer對(duì)象放入緩存,使其持久化。

(2)同時(shí)根據(jù)對(duì)象關(guān)系映射文件中設(shè)置的OID生成器,即主鍵生成方式給該對(duì)象生成一個(gè)唯一的OID。

<!--設(shè)置主鍵-->
<idname="id"column="ID"type="long">
<!--主鍵生成方式-->
<generatorclass="increment"/>
</id>

在這個(gè)地方有一個(gè)疑問,創(chuàng)建對(duì)象時(shí)setId()方法是否是為該對(duì)象持久化生成主鍵,其實(shí)不是,setId并沒有按照我們?cè)O(shè)定的那樣生成主鍵,而是靠對(duì)象關(guān)系映射文件配置的主鍵生成方式生成主鍵,可以多運(yùn)行幾次,主鍵自增長,從數(shù)據(jù)庫可以看到多條數(shù)據(jù),主鍵從1開始,所以可以知道setId()

沒有設(shè)置主鍵,否則數(shù)據(jù)庫主鍵唯一性校驗(yàn)都過不去。

我們也可以手動(dòng)設(shè)置主鍵值,必須重載save()方法,使用重載方法save(c1,newLong(1)),每次手動(dòng)設(shè)置。

(3)計(jì)劃執(zhí)行insert語句。注意,insert語句并沒有立刻執(zhí)行,只有當(dāng)Session清理緩存時(shí),才會(huì)執(zhí)行insert語句。tr.commit()事務(wù)提交。

2.Session的update()方法

使游離態(tài)對(duì)象變成持久態(tài)對(duì)象。例如:

SessionFactory sessionFactory; 
Configuration configuration = new Configuration().configure(); 
sessionFactory = configuration.buildSessionFactory(); 
Session session1 = sessionFactory.openSession(); 
Transaction tr1 = session1.beginTransaction(); 
//1.創(chuàng)建Customer對(duì)象 
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對(duì)象持久化 
session1.save(c1); 
tr1.commit(); 
session1.close(); 
//3.將游離態(tài)的對(duì)象更新,發(fā)現(xiàn)改變,執(zhí)行update語句 
Session session2 = sessionFactory.openSession(); 
Transaction tr2 = session2.beginTransaction(); 
c1.setAddress("測(cè)試update"); 
session2.update(c1); 
tr2.commit(); 
session2.close();

Session的update()注意做以下事:

(1)把游離態(tài)的Customer對(duì)象從新加入Session緩存中,使其變成持久化對(duì)象。

(2)執(zhí)行update語句。跟save()執(zhí)行insert語句一樣,并不是立刻執(zhí)行update語句,需要等緩存清空時(shí),把Customer對(duì)象組裝成update語句,

然后再執(zhí)行。

注意,即使Customer沒有改變,默認(rèn)情況下,緩存清除時(shí)也會(huì)組裝Update語句,如果需要設(shè)置成改變成才執(zhí)行update語句,需要設(shè)置對(duì)象關(guān)系映射文件。

3.Session的saveOrUpdate()方法

saveOrUpdate()方法包含save()和update()方法的功能,根據(jù)傳入?yún)?shù)狀態(tài),調(diào)用不同方法。傳入臨時(shí)態(tài)對(duì)象調(diào)用save()方法,如果傳入游離態(tài)對(duì)象調(diào)用

update()方法。傳入持久態(tài)對(duì)象返回。所以,每次我們只需傳入對(duì)象,saveOrUpdate()方法,自動(dòng)判斷傳入對(duì)象狀態(tài)的狀態(tài),動(dòng)態(tài)調(diào)用處理方法。

該方法如何判斷傳入對(duì)象的狀態(tài)?當(dāng)滿足以下任意一個(gè)條件時(shí),就是臨時(shí)態(tài):

(1)java對(duì)象的OID為null,說明該對(duì)象沒有別實(shí)例化,即使被實(shí)例化,也是游離態(tài)被刪除后變成臨時(shí)態(tài)的對(duì)象,這種情況下的對(duì)象為臨時(shí)態(tài)。

(2)如果java對(duì)象具有版本控制(version),版本號(hào)為null的,也就是沒有該對(duì)象的版本號(hào)。

(3)自定義攔截器,調(diào)用isUnsaved()返回值為true。

4.Session的load()和get()方法

這兩個(gè)方法都是根據(jù)OID,從數(shù)據(jù)庫中加載一個(gè)持久化對(duì)象。持久化對(duì)象放在Session緩存中,可以根據(jù)不同的需要操作該持久化對(duì)象。

兩者區(qū)別:

當(dāng)數(shù)據(jù)庫中OID沒有對(duì)應(yīng)記錄時(shí),load()拋異常,get()返回null。

5.Session的delete()方法

delete()顧名思義刪除,用于從數(shù)據(jù)庫中刪除java對(duì)象對(duì)應(yīng)的記錄。

delete()如果傳入持久化對(duì)象,組裝delete語句,執(zhí)行刪除;如果傳入游離態(tài)對(duì)象,hibernate先把游離態(tài)關(guān)聯(lián)到session,變成持久態(tài),再生成delete語句,

執(zhí)行刪除。

都是只有當(dāng)session緩存清空時(shí),才執(zhí)行。

以上執(zhí)行都是一個(gè)對(duì)象,對(duì)應(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對(duì)象 
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對(duì)象持久化 
session1.save(c1); 
tr1.commit(); 
session1.close(); 
//3.將游離態(tài)的對(duì)象關(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é)果,控制臺(tái)輸出:

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=?

總結(jié)

以上就是本文關(guān)于Hibernate中Session增刪改查操作代碼詳解的全部內(nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

相關(guān)文章

  • 關(guān)于Java集合框架面試題(含答案)下

    關(guān)于Java集合框架面試題(含答案)下

    Java集合框架為Java編程語言的基礎(chǔ),也是Java面試中很重要的一個(gè)知識(shí)點(diǎn)。這里,我列出了一些關(guān)于Java集合的重要問題和答案。
    2015-12-12
  • 養(yǎng)成良好java代碼編碼規(guī)范

    養(yǎng)成良好java代碼編碼規(guī)范

    這篇文章主要介紹了如何養(yǎng)成良好java代碼編碼規(guī)范,規(guī)范需要平時(shí)編碼過程中注意,是一個(gè)慢慢養(yǎng)成的好習(xí)慣,下面小編就帶大家來一起詳細(xì)了解一下吧
    2019-06-06
  • java項(xiàng)目依賴包選擇具體實(shí)現(xiàn)類示例介紹

    java項(xiàng)目依賴包選擇具體實(shí)現(xiàn)類示例介紹

    這篇文章主要為大家介紹了java項(xiàng)目依賴包選擇具體實(shí)現(xiàn)類示例介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • java封裝類型與基礎(chǔ)類型對(duì)比示例分析

    java封裝類型與基礎(chǔ)類型對(duì)比示例分析

    這篇文章主要為大家介紹了java封裝類型與基礎(chǔ)類型對(duì)比示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • SpringBoot如何使用Scala進(jìn)行開發(fā)的實(shí)現(xiàn)

    SpringBoot如何使用Scala進(jìn)行開發(fā)的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot如何使用Scala進(jìn)行開發(fā)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • HashMap的get()方法的NullPointerException問題

    HashMap的get()方法的NullPointerException問題

    這篇文章主要介紹了HashMap的get()方法的NullPointerException問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Springboot框架整合添加redis緩存功能

    Springboot框架整合添加redis緩存功能

    緩存就是一個(gè)存儲(chǔ)器,在技術(shù)選型中,常用?Redis?作為緩存數(shù)據(jù)庫。緩存主要是在獲取資源方便性能優(yōu)化的關(guān)鍵方面。Redis?是一個(gè)高性能的?key-value?數(shù)據(jù)庫,接下來通過本文給大家介紹Springboot框架整合添加redis緩存功能,感興趣的朋友一起看看吧
    2021-11-11
  • Java中print、printf、println的區(qū)別

    Java中print、printf、println的區(qū)別

    這篇文章主要介紹了Java中print、printf、println的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • JPA多條件復(fù)雜SQL動(dòng)態(tài)分頁查詢功能

    JPA多條件復(fù)雜SQL動(dòng)態(tài)分頁查詢功能

    這篇文章主要介紹了JPA多條件復(fù)雜SQL動(dòng)態(tài)分頁查詢功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

    這篇文章主要為大家詳細(xì)介紹了JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評(píng)論

徐州市| 峨山| 逊克县| 吉水县| 镇平县| 万山特区| 正宁县| 鄄城县| 峨边| 循化| 临邑县| 六枝特区| 怀来县| 精河县| 台中县| 抚松县| 海兴县| 尉犁县| 渑池县| 阜平县| 宁晋县| 永昌县| 阳江市| 乌拉特中旗| 遵化市| 静宁县| 射洪县| 皮山县| 新蔡县| 峨山| 永兴县| 环江| 万源市| 兰州市| 江西省| 关岭| 绩溪县| 福泉市| 治多县| 五家渠市| 科尔|