一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Hibernate中Session增刪改查操作代碼詳解

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

2021-03-03 14:01街燈下的小草 Java教程

這篇文章主要介紹了Hibernate中Session增刪改查操作代碼詳解,具有一定借鑒價值,需要的朋友可以參考下。

把三狀態轉換圖放在這,方便分析方法的作用:

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

1.Session的save()方法

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

Session的save()方法可以使臨時態或游離態轉換為持久態。例如,保存一個Customer對象:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SessionFactory sessionFactory;
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tr = session.beginTransaction();
//1.創建Customer對象
Customer c1 = new Customer();
c1.setId(new long(1));
c1.setName("test");
c1.setEmail("[email protected]");
c1.setPassword("123456");
c1.setAddress("世外桃源");
//2.調用Session的save()方法,將Customer對象持久化
session.save(c1);
tr.commit();
session.close();

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

(1)將new創建的臨時態的Customer對象放入緩存,使其持久化。

(2)同時根據對象關系映射文件中設置的OID生成器,即主鍵生成方式給該對象生成一個唯一的OID。

?
1
2
3
4
5
<!--設置主鍵-->
<idname="id"column="ID"type="long">
<!--主鍵生成方式-->
<generatorclass="increment"/>
</id>

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

沒有設置主鍵,否則數據庫主鍵唯一性校驗都過不去。

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

(3)計劃執行insert語句。注意,insert語句并沒有立刻執行,只有當Session清理緩存時,才會執行insert語句。tr.commit()事務提交。

2.Session的update()方法

使游離態對象變成持久態對象。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SessionFactory sessionFactory;
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
Session session1 = sessionFactory.openSession();
Transaction tr1 = session1.beginTransaction();
//1.創建Customer對象
Customer c1 = new Customer();
c1.setId(new Long(1));
c1.setName("test");
c1.setEmail("[email protected]");
c1.setPassword("123456");
c1.setAddress("世外桃源");
//2.調用Session的save()方法,將Customer對象持久化
session1.save(c1);
tr1.commit();
session1.close();
//3.將游離態的對象更新,發現改變,執行update語句
Session session2 = sessionFactory.openSession();
Transaction tr2 = session2.beginTransaction();
c1.setAddress("測試update");
session2.update(c1);
tr2.commit();
session2.close();

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

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

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

然后再執行。

注意,即使Customer沒有改變,默認情況下,緩存清除時也會組裝Update語句,如果需要設置成改變成才執行update語句,需要設置對象關系映射文件。

3.Session的saveOrUpdate()方法

saveOrUpdate()方法包含save()和update()方法的功能,根據傳入參數狀態,調用不同方法。傳入臨時態對象調用save()方法,如果傳入游離態對象調用

update()方法。傳入持久態對象返回。所以,每次我們只需傳入對象,saveOrUpdate()方法,自動判斷傳入對象狀態的狀態,動態調用處理方法。

該方法如何判斷傳入對象的狀態?當滿足以下任意一個條件時,就是臨時態:

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

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

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

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

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

兩者區別:

當數據庫中OID沒有對應記錄時,load()拋異常,get()返回null。

5.Session的delete()方法

delete()顧名思義刪除,用于從數據庫中刪除java對象對應的記錄。

delete()如果傳入持久化對象,組裝delete語句,執行刪除;如果傳入游離態對象,hibernate先把游離態關聯到session,變成持久態,再生成delete語句,

執行刪除。

都是只有當session緩存清空時,才執行。

以上執行都是一個對象,對應一條記錄。

可以用session.delete("fromCustomerwhere....");后面加上條件刪除多條數據。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SessionFactory sessionFactory;
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
Session session1 = sessionFactory.openSession();
Transaction tr1 = session1.beginTransaction();
//1.創建Customer對象
Customer c1 = new Customer();
c1.setId(new Long(1));
c1.setName("test");
c1.setEmail("[email protected]");
c1.setPassword("123456");
c1.setAddress("世外桃源");
//2.調用Session的save()方法,將Customer對象持久化
session1.save(c1);
tr1.commit();
session1.close();
//3.將游離態的對象關聯到session,持久化后清除緩存,執行delete語句;放入持久態的直接刪除;
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=?

總結

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

原文鏈接:http://blog.csdn.net/yhl_jxy/article/details/50685648

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品视频免费在线观看 | 疯狂刺激的3p国产在线 | 国产福利视频一区二区微拍视频 | 日韩无砖专区体验区 | 日韩一级片免费观看 | 免费观看欧美成人禁片 | 美女黄a| 日本视频中文字幕 | 天天摸天天碰色综合网 | 成年人免费看的视频 | 我不卡影院手机在线观看 | 91私密保健女子养生spa | 双子母性本能在线观看 | 四虎永久网址影院 | 日本xnxnxnxnxn护士 | 99热国产在线观看 | 欧美日韩精品乱国产 | leslessexvideos日本 | 九九精品视频在线播放 | 国产成人高清精品免费观看 | 国产亚洲99影院 | 色香视频在线 | 亚洲首页国产精品丝袜 | 牛人国产偷窥女洗浴在线观看 | 欧美日韩视频在线一区二区 | 国产成人咱精品视频免费网站 | 91麻豆精品国产自产在线观看 | 亚洲欧美日韩另类在线 | 黑人巨大初黑人解禁作品 | 欧美精品国产一区二区三区 | 国产一区二区免费在线 | 亚洲国产AV一区二区三区四区 | 欧美怡红院视频一区二区三区 | 国产成人久久精品一区二区三区 | 91色porny| 午夜国产精品视频在线 | 99久久er这里只有精品17 | 四虎最新永久免费网址 | 日本xxxxxxxxx59 | 国产成人精品曰本亚洲78 | 亚洲成aⅴ人片在线 |