欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
操縱持久化對象
1.    理解Session的緩存:
在Java里面,緩存通常是指Java對象的屬性占用的內存空間,通常是一些集合類(lèi)型的屬性。在session接口的實(shí)現類(lèi)SessionImpl中定義了一系列的Java集合,這些Java集合就構成了Session的緩存。
當Session的save()方法持久化一個(gè)對象時(shí),這個(gè)對象被加入到Session的緩存中,以后即使應用程序中的引用變量不再引用這個(gè)對象,只要Session的緩存還沒(méi)有被清空,這個(gè)對象仍然處于生命周期中。當Session的load()方法加載一個(gè)對象時(shí),Session會(huì )先判斷緩存中是否已經(jīng)存在這個(gè)對象了,如果存在,就不需要再到數據庫中重新加載了。
Session的緩存有兩大作用:
1.1.        減少訪(fǎng)問(wèn)數據庫的頻率。
1.2.        保證緩存中的對象與數據庫中的相關(guān)記錄保持同步。
Session有兩個(gè)方法:一個(gè)commit()事務(wù)提交方法,還有flush()刷新緩存方法,都有著(zhù)清理緩存的作用。flush()進(jìn)行緩存的清理,執行一系列的SQL語(yǔ)句,但不會(huì )提交事務(wù)。而commit()方法會(huì )先調用flush()方法,然后在提交事務(wù)。
2.    定義持久化類(lèi)的建議:
在應用程序中,用來(lái)實(shí)現業(yè)務(wù)問(wèn)題實(shí)體的(如,在電子商務(wù)應用程序中的Customer和Order) 類(lèi)就是持久化類(lèi)。如果這些持久化類(lèi)遵循一些簡(jiǎn)單的規則,Hibernate能夠工作得更好,這些規則也被稱(chēng)作簡(jiǎn)單傳統Java對象(POJO:Plain Old Java Object)編程模型。但是這些規則并不是必需的。最好要遵循以下幾條主要的規則:
1)      實(shí)現一個(gè)默認的(即無(wú)參數的)構造方法(constructor):
我們強烈建議,在Hibernate中,為了運行期代理的生成,構造方法至少是 包(package)內可見(jiàn)的。
2)      提供一個(gè)標識屬性(identifier property):
我們建議你對持久化類(lèi)聲明命名一致的標識屬性。我們還建議你使用一個(gè)可以為空(也就是說(shuō),不是原始類(lèi)型)的類(lèi)型。
3)      使用非final的類(lèi):
代理(proxies)是Hibernate的一個(gè)重要的功能,它依賴(lài)的條件是,持久 化類(lèi)或者是非final的,或者是實(shí)現了一個(gè)所有方法都聲明為public的接口。你也應該避免在非final類(lèi)中聲明 public final的方法。
4)      為持久化字段聲明訪(fǎng)問(wèn)器(accessors):
5)      如果你有如下需求,你必須重載 equals() 和 hashCode()方法:
l 想把持久類(lèi)的實(shí)例放入Set中(當表示多值關(guān)聯(lián)時(shí),推薦這么做)
l 想重用脫管實(shí)例
Hibernate保證,僅在特定會(huì )話(huà)范圍內,持久化標識(數據庫的行)和Java標識是等價(jià)的。因此,一旦 我們混合了從不同會(huì )話(huà)中獲取的實(shí)例,如果希望Set有明確的語(yǔ)義,就必須實(shí)現equals() 和hashCode()。
3.    持久化對象的三種狀態(tài):
一個(gè)持久化類(lèi)的實(shí)例可能處于三種不同狀態(tài)中的某一種。
3.1.    瞬時(shí)(transient)狀態(tài):
該實(shí)例是剛用new語(yǔ)句創(chuàng )建的,還沒(méi)有被持久化,不處于任何Session的緩存中。它沒(méi)有持久化標識(相當于主鍵值)。處于瞬時(shí)狀態(tài)的實(shí)例被稱(chēng)為瞬時(shí)對象。它的特點(diǎn)是:
不和任何一個(gè)Session實(shí)例關(guān)聯(lián)。在數據庫中沒(méi)有對應的記錄。
3.2.    持久化 (persistent) 狀態(tài):
已經(jīng)被持久化,加入到Session緩存中。處于持久化狀態(tài)的實(shí)例被稱(chēng)為持久化對象。
實(shí)例目前與某個(gè)Session有關(guān)聯(lián)。 它擁有持久化標識(相當于主鍵值),并且可能在數據庫中有一個(gè)對應的行。 Hibernate保證在同一個(gè)Sesion實(shí)例的緩存中,數據庫中的每條記錄只對應唯一的持久化對象。 它的特點(diǎn)是:
持久化對象總是被一個(gè)Session實(shí)例關(guān)聯(lián)。持久化對象和數據庫中的相關(guān)記錄對應。Session在清理緩存時(shí),會(huì )根據持久化對象的屬性變化,來(lái)同步更新數據庫。
3.3.    脫管(detached) 狀態(tài):
已經(jīng)被持久化過(guò),但不再處于Session的緩存中。處于脫管狀態(tài)的實(shí)例被稱(chēng)為脫管對象。實(shí)例曾經(jīng)與某個(gè)持久化上下文發(fā)生過(guò)關(guān)聯(lián),不過(guò)那個(gè)上下文被關(guān)閉了, 或者這個(gè)實(shí)例是被序列化(serialize)到另外的進(jìn)程。 它擁有持久化標識,并且在數據庫中可能存在一個(gè)對應的行。 對于脫管狀態(tài)的實(shí)例,Hibernate不保證任何持久化標識和Java標識的關(guān)系。它的特點(diǎn)是:
不再位于session的緩存中,即它不再和session關(guān)聯(lián)。它擁有持久化標識。
4.    Session的保存、刪除、更新和查詢(xún)方法:
4.1.    Session的save()方法:使用一個(gè)臨時(shí)對象轉變?yōu)槌志脤ο蟆?div style="height:15px;">
方法簽名:public Serializable save(Object object) throws HibernateException; 它完成以下操作:
1)      把持久化類(lèi)的實(shí)例加入到緩存中,使它變?yōu)槌志没瘜ο蟆?div style="height:15px;">
2)      選用映射文件指定的標識符生成器為持久化對象分配唯一的OID。
3)      計劃執行一個(gè)insert語(yǔ)句,把持久化對象當前的屬性值組裝到insert 語(yǔ)句(SQL DML)中。值得注意的是,save()方法并不是立即執行SQL insert語(yǔ)句。只有當Session清理緩存時(shí),才會(huì )執行SQL insert語(yǔ)句。
另外,需要注意的是:Hibernate通過(guò)持久化對象的OID來(lái)維持它和數據庫相關(guān)記錄的對應關(guān)系。所以當持久化的實(shí)例處于持久化狀態(tài)時(shí),不允許程序隨意修改它的OID。其實(shí),無(wú)論java對象處于瞬時(shí)狀態(tài)、持久化狀態(tài)還是脫管狀態(tài),程序都不應該修改它的OID。
4.2.    Session的update()方法:使一個(gè)脫管對象轉變?yōu)槌志没瘜ο蟆?div style="height:15px;">
方法簽名:public void update(Object object) throws HibernateException; 它完成以下操作:
1)      把脫管對象重新加入到Session緩存中,使它變?yōu)槌志没瘜ο蟆?div style="height:15px;">
2)      計劃執行一個(gè)update語(yǔ)句。值得注意的是,Session只有在清理緩存的時(shí)候才會(huì )執行update語(yǔ)句,并且在執行時(shí)才會(huì )把持久化對象當前的屬性值組裝到update語(yǔ)句中。
4.3.    Session的saveOrUpdate()方法:
方法簽名:public void saveOrUpdate(Object object) throws HibernateException ; saveOrUpdate()方法同時(shí)包含了save()與update()方法的功能,如果傳入的參數是瞬時(shí)對象,就調用save()方法;如果傳入的參數是脫管對象,就調用update()方法;如果傳入的參數是持久化對象,方法就直接返回。那么,saveOrUpdate()方法如果判斷一個(gè)對象處于瞬時(shí)狀態(tài)不是脫管狀態(tài)呢?如果滿(mǎn)足以下情況之一,Hibernate就把它作為臨時(shí)對象:
1)      Java對象的OID取值為null。
2)      Java對象具有version屬性,并且取值了null。
3)      在映射文件中為<id>元素設置了unsaved-value屬性,并且OID取值與unsaved-value屬性值匹配。
4)      在映射文件中為<version>元素設置了unsaved-value屬性,并且version屬性取值與unsaved-value屬性值匹配。
5)      自定義了Hibernate的Interceptor實(shí)現類(lèi),并且Interceptor的isUnsaved()方法返回Boolean.TRUE。
4.4.    Session的delete()方法:
方法簽名:public void delete(Object object) throws HibernateException; delete()方法用于從數據庫中刪除與Java對象對應的記錄。如果傳入的參數是持久化對象,Session就計劃執行一個(gè)delete語(yǔ)句。如果傳入的參數是游離對象,先使游離對象被Session關(guān)聯(lián),使它變?yōu)槌志没瘜ο?,然后計劃執行一個(gè)delete語(yǔ)句。值得注意的也是,Session只有在清理緩存的時(shí)候才會(huì )執行delete語(yǔ)句。
5.    通過(guò)主鍵ID取得數據對象:
5.1.    Session的get()方法:
方法簽名:public Object get(Class clazz, Serializable id) throws HibernateException; 根據給定的OID從數據庫中加載一個(gè)持久化對象,若數據庫中不存在與OID對應的記錄,此方法返回null。
get()方法的執行順序如下:
1)      首先通過(guò)id在session緩存中查找對象,如果存在此id主鍵值的對象,直接將其返回。如果不存在,將進(jìn)行第2步。
2)      在二級緩存中查找,找到后將其返回。
3)      如果在session緩存和二級緩存中都找不到此對象,剛從數據庫加載擁有此id的對象。如果數據庫也不存在這個(gè)擁有此id的對象,則返回null。
5.2.    Session的load()方法:
方法簽名:public Object load(Class theClass, Serializable id) throws HibernateException; 根據給定的OID從數據庫中加載一個(gè)持久化對象,若數據庫中不存在與OID對應的記錄,此方法將拋出org.hibernate.ObjectNotFoundException異常。
對于get和load的根本區別,一句話(huà),hibernate對于load方法認為該數據在數據庫中一定存在,可以放心的使用代理來(lái)延遲加載,如果在使用過(guò)程中發(fā)現了問(wèn)題,只能拋異常;而對于get方法,hibernate一定要獲取到真實(shí)的數據,否則返回null。
6.    Query接口:
Hibernate提供Query接口,它用來(lái)執行HQL語(yǔ)句。
6.1.    綁定參數
6.1.1.       使用 “?” 按參數位置綁定:
通過(guò)Query接口執行HQL語(yǔ)句時(shí),可以先設定查詢(xún)參數,然后通過(guò)setXXX()方法來(lái)綁定參數。如下
Query query = session.createQuery("from User as u where u.age > ? and u.name like ?");
query.setInteger(0, 25);
query.setString(1, "%a%");
List list = query.list();
Hibernate提供了綁定各種類(lèi)型的參數的方法,如參數為字符串類(lèi)型,可調用setString(),如果參數為整數類(lèi)型,可調用setInteger()方法,以此類(lèi)推。這些setXXX()方法的第1個(gè)參數HQL查詢(xún)語(yǔ)句中參數的位置,第2個(gè)參數代表HQL查詢(xún)語(yǔ)句中參數的值。
6.1.2.       使用 “:” 后跟變量名來(lái)按命名參數綁定:
可以使用命名參數來(lái)取代使用“?”設置參數的方法,這可以不用依照特定的順序來(lái)設定參數值,如上例可改成:
Query query = session.createQuery("from User as u where u.age > :minAge and u.name like likeName");
query.setInteger("minAge", 25);
query.setString("likeName", "%a%");
List list = query.list();
使用命名參數方式的綁定方式有以下優(yōu)勢:
1)      代碼可讀性更好。
2)      命名參數不依賴(lài)它們在查詢(xún)字符串中出現的位置。
3)      在同一個(gè)查詢(xún)中可以多次使用。
所以,應該優(yōu)先考慮使用命名參數方式。
6.2.    使用命名查詢(xún)(nameQuery):
可以將HQL語(yǔ)句編寫(xiě)在程序之外,以避免硬編碼在程序之中,這樣要修改HQL語(yǔ)句時(shí)就很方便。在xxx.hbm.xml中使用<qiuery/>標簽,并在<![CDATA[ 與 ]]> 之間編寫(xiě)HQL,如下Student.hbm.xml:
......
<hibernate-mapping>
<class name="org.qiujy.demo.User" table="user">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="age" column="age" type="java.lang.Integer"/>
</class>
<query name="queryUserByAgeAndName">
<![CDATA[
from User as u where u.age >:minAge and u.name like :likeName
]]>
</query>
</hibernate-mapping>
在代碼中這樣來(lái)調用:
Query query = session.getNamedQuery("queryUserByAgeAndName");
query.setInteger("minAge", 25);
query.setString("likeName", "%a%");
List list = query.list();
6.3.    Query接口的list()方法:
Query接口的list()方法用于取得一個(gè)List類(lèi)的實(shí)例,此實(shí)例中包括的可能是一個(gè)對象集合,也可能是一個(gè)對象數組集合。最常見(jiàn)的使用是用list()方法來(lái)取得一組符合實(shí)例對象。如上示例。
6.4.    Query接口的uniqueResult()方法:
當確信使用的HQL語(yǔ)句查詢(xún)時(shí)返回的集合中只有一個(gè)對象時(shí),就可以使用這個(gè)方法。但如果返回結果中有多個(gè)對象,使用這個(gè)方法會(huì )拋出org.hibernate.NonUniqueResultException 異常,說(shuō)“query did not return a unique result”。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Hibernate持久化對象的生命周期
hibernate實(shí)體對象的三種狀態(tài):自由狀態(tài),持久狀態(tài),游離狀態(tài).
Hibernate Session的delete()方法
Hibernate4實(shí)戰 之 第三部分:Hibernate的基本開(kāi)發(fā)
阿里巴巴Java方向面試題匯總(含答案)
ssh框架問(wèn)題
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久