本篇文章給大家分享的是有關(guān)Hibernate持久化對(duì)象的狀態(tài)有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的千陽(yáng)網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!Hibernate中的對(duì)象有3中狀態(tài),瞬時(shí)對(duì)象(TransientObjects)、持久化對(duì)象(PersistentObjects)和離線(xiàn)對(duì)象(DetachedObjects也叫做脫管對(duì)象)。
下圖3.1顯示了瞬時(shí)對(duì)象、持久化對(duì)象和離線(xiàn)對(duì)象之間的關(guān)系以及它們之間的轉(zhuǎn)換。
圖3.1
臨時(shí)狀態(tài):由Java的new命令開(kāi)辟內(nèi)存空間的java對(duì)象也就是普通的java對(duì)象,如果沒(méi)有變量引用它它將會(huì)被JVM收回。臨時(shí)對(duì)象在內(nèi)存中是孤立存在的,它的意義是攜帶信息載體,不和數(shù)據(jù)庫(kù)中的數(shù)據(jù)由任何的關(guān)聯(lián)。通過(guò)Session的save()方法和saveOrUpdate()方法可以把一個(gè)臨時(shí)對(duì)象和數(shù)據(jù)庫(kù)相關(guān)聯(lián),并把臨時(shí)對(duì)象攜帶的信息通過(guò)配置文件所做的映射插入數(shù)據(jù)庫(kù)中,這個(gè)臨時(shí)對(duì)象就成為持久化對(duì)象。
持久化狀態(tài):持久化對(duì)象在數(shù)據(jù)庫(kù)中有相應(yīng)的記錄,持久化對(duì)象可以是剛被保存的,或者剛被加載的,但都是在相關(guān)聯(lián)的session聲明周期中保存這個(gè)狀態(tài)。如果是直接數(shù)據(jù)庫(kù)查詢(xún)所返回的數(shù)據(jù)對(duì)象,則這些對(duì)象和數(shù)據(jù)庫(kù)中的字段相關(guān)聯(lián),具有相同的id,它們馬上變成持久化對(duì)象。如果一個(gè)臨時(shí)對(duì)象被持久化對(duì)象引用,也立馬變?yōu)槌志没瘜?duì)象。
如果使用delete()方法,持久化對(duì)象變?yōu)榕R時(shí)對(duì)象,并且刪除數(shù)據(jù)庫(kù)中相應(yīng)的記錄,這個(gè)對(duì)象不再與數(shù)據(jù)庫(kù)有任何的聯(lián)系。
持久化對(duì)象總是與Session和Transaction關(guān)聯(lián)在一起,在一個(gè)session中,對(duì)持久化對(duì)象的操作不會(huì)立即寫(xiě)到數(shù)據(jù)庫(kù),只有當(dāng)Transaction(事務(wù))結(jié)束時(shí),才真正的對(duì)數(shù)據(jù)庫(kù)更新,從而完成持久化對(duì)象和數(shù)據(jù)庫(kù)的同步。在同步之前的持久化對(duì)象成為臟對(duì)象。
當(dāng)一個(gè)session()執(zhí)行close()、clear()、或evict()之后,持久化對(duì)象就變?yōu)殡x線(xiàn)對(duì)象,這時(shí)對(duì)象的id雖然擁有數(shù)據(jù)庫(kù)的識(shí)別值,但已經(jīng)不在Hibernate持久層的管理下,他和臨時(shí)對(duì)象基本上一樣的,只不過(guò)比臨時(shí)對(duì)象多了數(shù)據(jù)庫(kù)標(biāo)識(shí)id。沒(méi)有任何變量引用時(shí),jvm將其回收。
脫管狀態(tài):Session關(guān)閉之后,與此Session關(guān)聯(lián)的持久化對(duì)象就變成為脫管對(duì)象,可以繼續(xù)對(duì)這個(gè)對(duì)象進(jìn)行修改,如果脫管對(duì)象被重新關(guān)聯(lián)到某個(gè)新的Session上,會(huì)在此轉(zhuǎn)成持久對(duì)象。
脫管對(duì)象雖然擁有用戶(hù)的標(biāo)識(shí)id,所以通過(guò)update()、saveOrUpdate()等方法,再次與持久層關(guān)聯(lián)。
下面我們就通過(guò)使用hibernate,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查來(lái)體現(xiàn)三種狀態(tài)之間的轉(zhuǎn)換過(guò)程。
添加修改演示三種狀態(tài)之間的變化
當(dāng)我們建立Session都要實(shí)例化SessionFactory,所以我們把重復(fù)的代碼進(jìn)行封裝,并且session是單線(xiàn)程的。我們把對(duì)session的管理,打開(kāi)session,關(guān)閉session等封裝到工具類(lèi)中,代碼如下所示。
package com.bjpowernode.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory factory; //static只初始化一次. static { try{ //默認(rèn)讀取的是hibernate.cfg.xml 文件. Configuration cfg = new Configuration().configure(); //建立SessionFactory. factory = cfg.buildSessionFactory(); }catch(Exception e ) { e.printStackTrace(); } } public static Session getSession() { //打開(kāi)session. return factory.openSession(); } //關(guān)閉session. public static void closeSession(Session session) { //判斷是否為空. //判斷是否是打開(kāi)狀態(tài)再進(jìn)行關(guān)閉. if(session!=null) { if(session.isOpen()) { session.close(); } } } //返回工廠(chǎng)類(lèi). public static SessionFactory getSessionFactory() { return factory; } }