亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

hibernate 三種狀態(tài)的轉(zhuǎn)換

 更新時(shí)間:2017年03月20日 09:24:59   作者:WhyWin  
本文主要介紹了hibernate三種狀態(tài)的轉(zhuǎn)換。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧

一、遇到的神奇的事情

使用jpa操作數(shù)據(jù)庫(kù),當(dāng)我使用findAll()方法查處一個(gè)List的對(duì)象后,給對(duì)這個(gè)list的實(shí)體進(jìn)行了一些操作,并沒(méi)有調(diào)用update 或者 saveOrUpdate方法,更改后的數(shù)據(jù)卻神奇的保存到數(shù)據(jù)庫(kù)里面去了。

最后簡(jiǎn)單粗暴的解決辦法是把這份從數(shù)據(jù)里面查出來(lái)的List  復(fù)制了一份,然后再操作,再返回。數(shù)據(jù)就正常了,數(shù)據(jù)庫(kù)也沒(méi)更新。后面找了資料才發(fā)現(xiàn)是jpa是對(duì)hibernate的封裝,底層是hibernate,這是hibernate的持久狀態(tài)搞的鬼。

二、hibernate的三種狀態(tài)

1. 瞬時(shí)狀態(tài) (Transient)

當(dāng)我們通過(guò)Java的new關(guān)鍵字來(lái)生成一個(gè)實(shí)體對(duì)象時(shí),這時(shí)這個(gè)實(shí)體對(duì)象就處于自由狀態(tài),如下:

Customer customer=new Customer(“zx”,27,images);

這時(shí)customer對(duì)象就處于自由狀態(tài),為什么說(shuō)customer對(duì)象處于自由狀態(tài)呢?這是因?yàn)?,此時(shí)customer只是通過(guò)JVM獲得了一塊內(nèi)存空間,還并沒(méi)有通過(guò)Session對(duì)象的save()方法保存進(jìn)數(shù)據(jù)庫(kù),因此也就還沒(méi)有納入Hibernate的緩存管理中,也就是說(shuō)customer對(duì)象現(xiàn)在還自由的游蕩于Hibernate緩存管理之外。所以我們可以看出自由對(duì)象最大的特點(diǎn)就是,在數(shù)據(jù)庫(kù)中不存在一條與它對(duì)應(yīng)的記錄。

瞬時(shí)對(duì)象特點(diǎn):

  • 不和 Session 實(shí)例關(guān)聯(lián)
  • 在數(shù)據(jù)庫(kù)中沒(méi)有和瞬時(shí)對(duì)象關(guān)聯(lián)的記錄

2. 持久狀態(tài) (Persistent)

持久化對(duì)象就是已經(jīng)被保存進(jìn)數(shù)據(jù)庫(kù)的實(shí)體對(duì)象,并且這個(gè)實(shí)體對(duì)象現(xiàn)在還處于Hibernate的緩存管理之中。這是對(duì)該實(shí)體對(duì)象的任何修改,都會(huì)在清理緩存時(shí)同步到數(shù)據(jù)庫(kù)中。如下所示:

Customer customer=new Customer(“zx”,27,images);
tx=session.beginTransaction();
session.save(customer);
customer=(Customer)session.load(Customer.class,”1”);
customer.setAge(28);
tx.commit();

這時(shí)我們并沒(méi)有顯示調(diào)用session.update()方法來(lái)保存更新,但是對(duì)實(shí)體對(duì)象的修改還是會(huì)同步更新到數(shù)據(jù)庫(kù)中,因?yàn)榇藭r(shí)customer對(duì)象通過(guò)save方法保存進(jìn)數(shù)據(jù)庫(kù)后,已經(jīng)是持久化對(duì)象了,然后通過(guò)load方法再次加載它,它仍然是持久化對(duì)象,所以它還處于Hibernate緩存的管理之中,這時(shí)當(dāng)執(zhí)行tx.commit()方法時(shí),Hibernate會(huì)自動(dòng)清理緩存,并且自動(dòng)將持久化對(duì)象的屬性變化同步到到數(shù)據(jù)庫(kù)中。

持久的實(shí)例在數(shù)據(jù)庫(kù)中有對(duì)應(yīng)的記錄,并擁有一個(gè)持久化標(biāo)識(shí) (identifier).

持久對(duì)象總是與 Session 和 Transaction 相關(guān)聯(lián),在一個(gè) Session 中,對(duì)持久對(duì)象的改變不會(huì)馬上對(duì)數(shù)據(jù)庫(kù)進(jìn)行變更,而必須在 Transaction 終止,也就是執(zhí)行 commit() 之后,才在數(shù)據(jù)庫(kù)中真正運(yùn)行 SQL 進(jìn)行變更,持久對(duì)象的狀態(tài)才會(huì)與數(shù)據(jù)庫(kù)進(jìn)行同步。在同步之前的持久對(duì)象稱為臟 (dirty) 對(duì)象。

瞬時(shí)對(duì)象轉(zhuǎn)為持久對(duì)象:

  • 通過(guò) Session 的 save() 和 saveOrUpdate() 方法把一個(gè)瞬時(shí)對(duì)象與數(shù)據(jù)庫(kù)相關(guān)聯(lián),這個(gè)瞬時(shí)對(duì)象就成為持久化對(duì)象。
  • 使用 fine(),get(),load() 和 iterater() 待方法查詢到的數(shù)據(jù)對(duì)象,將成為持久化對(duì)象。

持久化對(duì)象的特點(diǎn):

  • 和 Session 實(shí)例關(guān)聯(lián)
  • 在數(shù)據(jù)庫(kù)中有和持久對(duì)象關(guān)聯(lián)的記錄

3. 脫管狀態(tài) (Detached)

當(dāng)一個(gè)持久化對(duì)象,脫離開(kāi)Hibernate的緩存管理后,它就處于游離狀態(tài),游離對(duì)象和自由對(duì)象的最大區(qū)別在于,游離對(duì)象在數(shù)據(jù)庫(kù)中可能還存在一條與它對(duì)應(yīng)的記錄,只是現(xiàn)在這個(gè)游離對(duì)象脫離了Hibernate的緩存管理,而自由對(duì)象不會(huì)在數(shù)據(jù)庫(kù)中出現(xiàn)與它對(duì)應(yīng)的數(shù)據(jù)記錄。如下所示:

Customer customer=new Customer(“zx”,27,images);
tx=session.beginTransaction();
session.save(customer);
customer=(Customer)session.load(Customer.class,”1”);
customer.setAge(28);
tx.commit();
session.close();

當(dāng)session關(guān)閉后,customer對(duì)象就不處于Hibernate的緩存管理之中了,但是此時(shí)在數(shù)據(jù)庫(kù)中還存在一條與customer對(duì)象對(duì)應(yīng)的數(shù)據(jù)記錄,所以此時(shí)customer對(duì)象處于游離態(tài)

與持久對(duì)象關(guān)聯(lián)的 Session 被關(guān)閉后,對(duì)象就變?yōu)槊摴軐?duì)象。對(duì)脫管對(duì)象的引用依然有效,對(duì)象可繼續(xù)被修改。

脫管對(duì)象特點(diǎn):

  • 本質(zhì)上和瞬時(shí)對(duì)象相同
  • 只是比愛(ài)瞬時(shí)對(duì)象多了一個(gè)數(shù)據(jù)庫(kù)記錄標(biāo)識(shí)值 id.

持久對(duì)象轉(zhuǎn)為脫管對(duì)象:

當(dāng)執(zhí)行 close() 或 clear(),evict() 之后,持久對(duì)象會(huì)變?yōu)槊摴軐?duì)象。

瞬時(shí)對(duì)象轉(zhuǎn)為持久對(duì)象:

通過(guò) Session 的 update(),saveOrUpdate() 和 lock() 等方法,把脫管對(duì)象變?yōu)槌志脤?duì)象。

三、三種狀態(tài)的轉(zhuǎn)換

四、舉例子

1、結(jié)合 save(),update(),saveOrUpdate() 方法說(shuō)明對(duì)象的狀態(tài)

(1)Save() 方法將瞬時(shí)對(duì)象保存到數(shù)據(jù)庫(kù),對(duì)象的臨時(shí)狀態(tài)將變?yōu)槌志没癄顟B(tài)。當(dāng)對(duì)象在持久化狀態(tài)時(shí),它一直位于 Session 的緩存中,對(duì)它的任何操作在事務(wù)提交時(shí)都將同步到數(shù)據(jù)庫(kù),因此,對(duì)一個(gè)已經(jīng)持久的對(duì)象調(diào)用 save()或 update() 方法是沒(méi)有意義的。如:

Student stu = new Strudnet();
stu.setCarId(“200234567”);
stu.setId(“100”);
// 打開(kāi) Session, 開(kāi)啟事務(wù)
session.save(stu);
stu.setCardId(“20076548”);
session.save(stu); // 無(wú)效
session.update(stu); // 無(wú)效
// 提交事務(wù),關(guān)閉 Session

(2)update() 方法兩種用途重新關(guān)聯(lián)脫管對(duì)象為持久化狀態(tài)對(duì)象,顯示調(diào)用 update() 以更新對(duì)象。調(diào)用 update() 只為了關(guān)聯(lián)一個(gè)脫管對(duì)象到持久狀態(tài),當(dāng)對(duì)象已經(jīng)是持久狀態(tài)時(shí),調(diào)用 update() 就沒(méi)有多大意義了。如:

// 打開(kāi) session ,開(kāi)啟事務(wù) 
stu = (Student)session.get(Student.class,”123456”);
stu.setName(“Body”);
session.update(stu); // 由于 stu 是持久對(duì)象,必然位于 Session 緩沖中,
對(duì) stu 所做的變更將 // 被同步到數(shù)據(jù)庫(kù)中。所以 update() 是沒(méi)有意義的,可以不要這句效果一樣的。
// 提交事務(wù),關(guān)閉 Session
Hibernate 總是執(zhí)行 update 語(yǔ)句,不管這個(gè)脫管對(duì)象在離開(kāi) Session 之后有沒(méi)有更改過(guò),在清理緩存時(shí) Hibernate總是發(fā)送一條 update 語(yǔ)句,以確保脫管對(duì)象和數(shù)據(jù)庫(kù)記錄的數(shù)據(jù)一致,如:
Student stu = new Strudnet();
stu.setCarId(“1234”);
// 打開(kāi) Session1, 開(kāi)啟事務(wù)
session1.save(stu);
// 提交事務(wù),關(guān)閉 Session1
stu.set(“4567”); // 對(duì)脫管對(duì)象進(jìn)行更改
// 打開(kāi) Session2, 開(kāi)啟事務(wù)
session2.update(stu);
// 提交事務(wù),關(guān)閉 Session2

注:即使把 session2.update(stu); 這句去掉,提交事務(wù)時(shí)仍然會(huì)執(zhí)行一條 update() 語(yǔ)句。

如果希望只有脫管對(duì)象改變了, Hibernate 才生成 update 語(yǔ)句,可以把映射文件中 <class> 標(biāo)簽的 select-before-update 設(shè)為 true, 這種會(huì)先發(fā)送一條 select 語(yǔ)句取得數(shù)據(jù)庫(kù)中的值,判斷值是否相同,如果相同就不執(zhí)行 update語(yǔ)句。不過(guò)這種做法有一定的缺點(diǎn),每次 update 語(yǔ)句之前總是要發(fā)送一條多余的 select 語(yǔ)句,影響性能。對(duì)于偶爾更改的類,設(shè)置才是有效的,對(duì)于經(jīng)常要更改的類這樣做是影響效率的。

(3)saveOrUpdate() 方法兼具 save() 和 update() 方法的功能,對(duì)于傳入的對(duì)象, saveOrUpdate() 首先判斷其是脫管對(duì)象還是臨時(shí)對(duì)象,然后調(diào)用合適的方法。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Springboot如何獲取配置文件application.yml中自定義的變量并使用

    Springboot如何獲取配置文件application.yml中自定義的變量并使用

    這篇文章主要介紹了Springboot中獲取配置文件(application.yml)中自定義的變量并使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • idea中安裝VisualVM監(jiān)控jvm的圖文教程

    idea中安裝VisualVM監(jiān)控jvm的圖文教程

    這篇文章主要介紹了idea中安裝VisualVM監(jiān)控jvm的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring?中的InitializingBean使用示例

    Spring?中的InitializingBean使用示例

    InitializingBean?是?Spring?框架中的一個(gè)接口,用于在?Spring?容器中初始化?bean?時(shí)執(zhí)行特定的初始化邏輯,這篇文章主要介紹了Spring?中的InitializingBean使用示例,需要的朋友可以參考下
    2024-08-08
  • 關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用

    關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用

    這篇文章主要介紹了關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用,SpringMVC是一個(gè)基于Spring框架的Web框架,它提供了一種簡(jiǎn)單、靈活的方式來(lái)開(kāi)發(fā)Web應(yīng)用程序,在開(kāi)發(fā)Web應(yīng)用程序時(shí),我們需要將用戶提交的數(shù)據(jù)綁定到我們的Java對(duì)象上,需要的朋友可以參考下
    2023-07-07
  • Java中一些基礎(chǔ)概念的使用詳解

    Java中一些基礎(chǔ)概念的使用詳解

    本篇文章是對(duì)在Java中一些基礎(chǔ)概念的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Java微信支付之公眾號(hào)支付、掃碼支付實(shí)例

    Java微信支付之公眾號(hào)支付、掃碼支付實(shí)例

    微信支付已經(jīng)成為生活中必不可少的付款方式,本篇文章主要介紹了Java微信支付之公眾號(hào)支付、掃碼支付,有需要的小伙伴可以了解一下。
    2016-11-11
  • 源碼解析帶你了解LinkedHashMap

    源碼解析帶你了解LinkedHashMap

    大多數(shù)情況下,只要不涉及線程安全問(wèn)題,Map基本都可以使用HashMap,不過(guò)HashMap有一個(gè)問(wèn)題,就是迭代HashMap的順序并不是HashMap放置的順序,也就是無(wú)序。HashMap的這一缺點(diǎn)往往會(huì)帶來(lái)困擾,所以LinkedHashMap就閃亮登場(chǎng)了,這篇文章通過(guò)源碼解析帶你了解LinkedHashMap
    2021-09-09
  • 二進(jìn)制中1的個(gè)數(shù)

    二進(jìn)制中1的個(gè)數(shù)

    這篇文章介紹了二進(jìn)制中1的個(gè)數(shù),有需要的朋友可以參考一下
    2013-09-09
  • Mybatis一對(duì)多與多對(duì)一查詢處理詳解

    Mybatis一對(duì)多與多對(duì)一查詢處理詳解

    這篇文章主要給大家介紹了關(guān)于Mybatis一對(duì)多與多對(duì)一查詢處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • java實(shí)現(xiàn)轉(zhuǎn)圈打印矩陣算法

    java實(shí)現(xiàn)轉(zhuǎn)圈打印矩陣算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)轉(zhuǎn)圈打印矩陣算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評(píng)論