日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SSH学习-Hibernate对象生命周期管理

發布時間:2024/9/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SSH学习-Hibernate对象生命周期管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Hibernate對象就是java中的實體對象,管理就是在實體對象的生命周期內被Hibernate的操作,Hibernate對象的生命周期其實就是實體對象的生命周期(從創建到最后被GC回收),期間對實體對象的操作就是Hibernate對象生命周期管理。具體是使用Hibernate的API,對Hibernate的對象進行狀態的切換,一般在臨時狀態,持久狀態和游離狀態三個之間進行。下面簡單的記錄下三種狀態的特點以及如何使用API對其進行切換。

Hibernate對象的三種狀態

(1)臨時狀態:內存中有對象,DB中沒有數據,修改內存中的數據對DB中的沒有影響?

(2)持久狀態:內存中有對象,DB中也有數據,通過操作內存中的對象可以修改DB中的數據

(3)游離狀態:內存中有對象,DB中也有數據,對象與數據斷開連接,修改對象不會影響DB中的數據

Hibernate對象狀態的切換

Hibernate對象的三種狀態可以實現切換,具體參考下圖,選擇合適的API,就能實現狀態的變化。另外使用session的get方法得到的對象,這個對象就是持久狀態,對其操作會影響DB中的數據。下圖中從持久狀態切換到游離狀態有clear方法和evict方法,前者是將session中的所有對象進行清除,后者是只清除一個對象。

Hibernate對象狀態切換測試

下面將通過以下幾個測試來觀察對不同狀態Hibernate對象的操作,DB中數據的變化。

(1)對持久狀態對象的操作

使用session對象get到student對象后,將名字修改為'new name',再查看DB中是否有變化。

測試代碼:

//測試Hibernate對象管理,對持久狀態的對象操作將影響數據庫結果 @Testpublic void testUpdate() {Session session=getSession();//開始事務Transaction trans=session.beginTransaction();trans.begin();//使用get方法獲取持久狀態的對象Student stu=(Student) session.get(Student.class, 4);System.out.println(stu);//修改對象的名字stu.setName("new name");System.out.println(stu);//提交事務 trans.commit();//關閉session session.close();}

測試前DB中情況:

測試后DB中的情況:

?

可以看出,對獲取的對象操作,將直接影響DB中數據的結果,并且直接setName后,再次輸出stu后name已更新為'new name'。

(2)測試從持久狀態變成臨時狀態

從持久狀態變成臨時狀態可以使用session的delete方法,獲取剛才修改了名字的stu后,再將其delete,測試DB中的情況。

測試代碼:

//測試從持久狀態變到臨時狀態 @Testpublic void testDelete() {Session session=getSession();//開始事務Transaction trans=session.beginTransaction();trans.begin();//使用get方法獲取持久狀態的對象Student stu=(Student) session.get(Student.class, 4);System.out.println(stu);//使用delete方法刪除 session.delete(stu);System.out.println(stu);//提交事務 trans.commit();//關閉session session.close();}

測試前DB情況:

測試后DB情況:

?

測試發現使用delete方法后,數據庫中沒有了id為4,name為'new name'的這條記錄,但是依然可以使用print方法打印出這個對象,說明對象依然存在內存中,DB中卻沒有了數據。

(3)測試從持久狀態變成游離狀態

從持久狀態變成游離狀態,使用evict方法,從當前session中清除出來,如果使用clear方法就是清除所有session中的對象。

測試代碼:

//測試從持久狀態變成游離狀態,使用evict方法,從當前session中清除出來,如果使用clear方法就是清除所有session中的對象 @Testpublic void testEvict() {Session session=getSession();//開始事務Transaction trans=session.beginTransaction();trans.begin();//使用get方法獲取持久狀態的對象Student stu=(Student) session.get(Student.class, 5);System.out.println(stu); //將對象從session中清除 session.evict(stu);//對對象進行操作,修改名字,看看是否對數據庫數據有影響stu.setName("new name");System.out.println(stu);//提交事務 trans.commit();//關閉session session.close();}

測試前DB情況:

測試后DB情況:

測試發現當Hibernate對象變成游離狀態后,對實體對象的操作不會影響DB中的數據。

(4)測試從游離狀態回到持久狀態

?從游離狀態回到持久狀態,可以調用session的update方法,將上面id為5,name為'clyang'的對象名字修改為'new name'。但是在修改之前先將對象切換為游離狀態,使用session的evict方法。

測試代碼:

//測試從游離狀態回到持久狀態,可以調用update方法 @Testpublic void testObjUpdate() {Session session=getSession();//開始事務Transaction trans=session.beginTransaction();trans.begin();//使用get方法獲取持久狀態的對象Student stu=(Student) session.get(Student.class, 5);System.out.println(stu); //將對象變成游離狀態然后再后續操作 session.evict(stu);//對對象進行操作,修改名字,看看是否對數據庫數據有影響stu.setName("new name");//使用session的update方法 session.update(stu);System.out.println(stu);//提交事務 trans.commit();//關閉session session.close();}

測試前DB情況:

測試后DB情況:

可以看出,當游離狀態的stu對象更新name屬性為'new name'后,再執行session的update方法,則DB中數據也發生了變化,說明將stu對象從游離狀態又變回到了持久狀態。

結論

Hibernate對象的生命周期就是Java實體對象的生命周期,對其生命周期的管理,是通過切換不同的狀態來實現的,具體的三種狀態分別為臨時狀態、持久狀態和游離狀態。

轉載于:https://www.cnblogs.com/youngchaolin/p/10901988.html

總結

以上是生活随笔為你收集整理的SSH学习-Hibernate对象生命周期管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。