乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Hibernate三態(tài),游離態(tài)

       曾今最強(qiáng) 2011-03-23

      Hibernate三態(tài),游離態(tài)

      Hibernate對(duì)象狀態(tài)
      臨時(shí)(Transient) - 由new操作符創(chuàng)建,且尚未與Hibernate Session 關(guān)聯(lián)的對(duì)象被認(rèn)定為臨時(shí)(Transient)的。臨時(shí)(Transient)對(duì)象不會(huì)被持久化到數(shù)據(jù)庫(kù)中,也不會(huì)被賦予持久化標(biāo)識(shí)(identifier)。 如果臨時(shí)(Transient)對(duì)象在程序中沒(méi)有被引用,它會(huì)被垃圾回收器(garbage collector)銷(xiāo)毀。 使用Hibernate Session可以將其變?yōu)槌志?Persistent)狀態(tài)。(Hibernate會(huì)自動(dòng)執(zhí)行必要的SQL語(yǔ)句)

      持久(Persistent) - 持久(Persistent)的實(shí)例在數(shù)據(jù)庫(kù)中有對(duì)應(yīng)的記錄,并擁有一個(gè)持久化標(biāo)識(shí)(identifier)。 持久(Persistent)的實(shí)例可能是剛被保存的,或剛被加載的,無(wú)論哪一種,按定義,它存在于相關(guān)聯(lián)的Session作用范圍內(nèi)。 Hibernate會(huì)檢測(cè)到處于持久(Persistent)狀態(tài)的對(duì)象的任何改動(dòng),在當(dāng)前操作單元(unit of work)執(zhí)行完畢時(shí)將對(duì)象數(shù)據(jù)(state)與數(shù)據(jù)庫(kù)同步(synchronize)。 開(kāi)發(fā)者不需要手動(dòng)執(zhí)行UPDATE。將對(duì)象從持久(Persistent)狀態(tài)變成瞬時(shí)(Transient)狀態(tài)同樣也不需要手動(dòng)執(zhí)行DELETE語(yǔ)句。

      游離(Detached) - 與持久(Persistent)對(duì)象關(guān)聯(lián)的Session被關(guān)閉后,對(duì)象就變?yōu)橛坞x(Detached)的。 對(duì)游離(Detached)對(duì)象的引用依然有效,對(duì)象可繼續(xù)被修改。游離(Detached)對(duì)象如果重新關(guān)聯(lián)到某個(gè)新的Session上, 會(huì)再次轉(zhuǎn)變?yōu)槌志?Persistent)的(在Detached其間的改動(dòng)將被持久化到數(shù)據(jù)庫(kù))。 這個(gè)功能使得一種編程模型,即中間會(huì)給用戶(hù)思考時(shí)間(user think-time)的長(zhǎng)時(shí)間運(yùn)行的操作單元(unit of work)的編程模型成為可能。 我們稱(chēng)之為應(yīng)用程序事務(wù),即從用戶(hù)觀點(diǎn)看是一個(gè)操作單元(unit of work)。

      Hibernate中對(duì)象的游離狀態(tài)是指Session關(guān)閉之后,持久化對(duì)象變成離線對(duì)象,離線對(duì)象就不能同數(shù)據(jù)庫(kù)同步,也不再受Hibernate管理。操作 處于游離態(tài)對(duì)象 經(jīng)常會(huì)報(bào) session已關(guān)閉的錯(cuò)誤。

      假設(shè)場(chǎng)景:
      有兩個(gè)類(lèi), Team, Person. 映射關(guān)系是Team一對(duì)多Person, 采用lazy fetch策略。
      session begin
      Team t = *Dao.get()
      session end
      t.getPersons()// 出錯(cuò)
      如果是用spring管理session的情況,事務(wù)外操作t.getPerons()也跟上面情況一樣。
      這種情況在生產(chǎn)環(huán)境多表現(xiàn)為在jsp頁(yè)面操作 t對(duì)象時(shí)出錯(cuò)。

      解決方法:
      1. 取消lazy fetch策略
      缺點(diǎn):會(huì)導(dǎo)致過(guò)多的數(shù)據(jù)庫(kù)訪問(wèn),因?yàn)槭且粚?duì)多的情況。
      2. 在事務(wù)內(nèi)就先把關(guān)聯(lián)的對(duì)象取出
      缺點(diǎn):會(huì)導(dǎo)致service層方法不統(tǒng)一,因?yàn)橐珠_(kāi)取出與不取出的情況。
      3. 使用spring的 openSessionInview機(jī)制
      缺點(diǎn): session打開(kāi)的時(shí)間比較長(zhǎng), 使用不好可能會(huì)導(dǎo)致out of memory

       

      一個(gè)游離態(tài)的對(duì)象轉(zhuǎn)換為持久戰(zhàn)態(tài),有以下幾種方法:

      1、session.saveOrUpdate(object)。這語(yǔ)句會(huì)把游離態(tài)的PO轉(zhuǎn)為持久態(tài)的PO并提交給數(shù)據(jù)庫(kù)

      2、session.merge(object)。這語(yǔ)句會(huì)把游離態(tài)的PO轉(zhuǎn)為持久態(tài)的PO,并進(jìn)行合并操作。

      3、session.lock(object, LockMode.NONE)。這語(yǔ)句只會(huì)把游離態(tài)的PO轉(zhuǎn)為持久態(tài)PO,不作其他操作。不過(guò),PO必須是沒(méi)有修改過(guò)的,這方法挺適合做一個(gè)應(yīng)用層

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多