軟件中間件技術(shù)UNIT13_第1頁
軟件中間件技術(shù)UNIT13_第2頁
軟件中間件技術(shù)UNIT13_第3頁
軟件中間件技術(shù)UNIT13_第4頁
軟件中間件技術(shù)UNIT13_第5頁
已閱讀5頁,還剩106頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Entity Bean 13.2 BMP Entity Bean13.2 BMP Entity Bean13.1 13.1 實(shí)體實(shí)體BeanBean編程基礎(chǔ)編程基礎(chǔ)13.3 CMP Entity Bean13.3 CMP Entity Bean13.4 13.4 EJB QLEJB QL語言語言13.1 實(shí)體實(shí)體Bean編程基礎(chǔ)編程基礎(chǔ) 1. 什么是Entity Bean2. Entity Bean所包含的文件 3. Entity Bean的一些特點(diǎn) 1. 什么是什么是Entity Bean Entity Bean是表示數(shù)據(jù)的組件。 Entity Bean用成員變量來存放來自數(shù)據(jù)庫中的數(shù)據(jù),數(shù)

2、據(jù)庫中的每一例都對(duì)應(yīng)與Entity Bean對(duì)象的一個(gè)成員變量,數(shù)據(jù)庫中的一條記錄則對(duì)應(yīng)一個(gè)Entity Bean對(duì)象實(shí)例,Entity Bean還提供一些與變量相關(guān)的操作方法。 2. Entity Bean所包含的文件 Entity Bean類 一個(gè)Entity Bean類的定義對(duì)應(yīng)于數(shù)據(jù)庫的一張表或視圖,而一個(gè)Entity Bean類的實(shí)例則對(duì)應(yīng)于表或視圖的一條記錄。在這個(gè)類中,可以定義一些處理數(shù)據(jù)的方法,也需要一些供 EJB 容器調(diào)用的方法,EJB 容器通過這些方法來管理EntityBean。2. Entity Bean所包含的文件Entity Bean的Remote接口 實(shí)現(xiàn)Remot

3、e接口的對(duì)象是EJB對(duì)象??蛻舳送ㄟ^調(diào)用EJB對(duì)象來間接訪問Entity Bean的實(shí)例。Entity Bean的Home接口 客戶端利用這個(gè)接口來創(chuàng)建、查找、刪除Entity Bean的EJB對(duì)象,在這個(gè)接口里面除了要定義一些創(chuàng)建EJB對(duì)象的方法和刪除EJB對(duì)象的方法,還要定義一些查找EJB對(duì)象的方法。實(shí)現(xiàn)接口的對(duì)象叫Home對(duì)象。2. Entity Bean所包含的文件Entity Bean的local 接口和local Home接口 在很多時(shí)候Entity Bean的客戶端是一些運(yùn)行在同一個(gè)EJB容器中的其他Session Bean或Entity Bean,local接口和local H

4、ome接口就是Entity Bean的本地接口。 Entity Bean的主鍵類 主鍵類包含了能唯一標(biāo)識(shí)數(shù)據(jù)庫中一條記錄的字段,這些字段都對(duì)應(yīng)于主鍵類中的一個(gè)成員變量。主鍵類必須是實(shí)現(xiàn)了序列化接口的可序列化Java對(duì)象。2. Entity Bean所包含的文件 Entity Bean的部署描述文件 這個(gè)文件包含了一些在部署時(shí)EJB容器要用到的屬性列表。 3. Entity Bean的一些特點(diǎn)的一些特點(diǎn) Entity Bean的壽命很長 3. Entity Bean的一些特點(diǎn)的一些特點(diǎn) Entity Bean是數(shù)據(jù)庫的視圖 EjbStore() 和ejbLoad()方法完成內(nèi)存中的數(shù)據(jù)和數(shù)據(jù)庫中

5、的數(shù)據(jù)同步。ejbLoad()方法負(fù)責(zé)從數(shù)據(jù)庫中把數(shù)據(jù)讀入到Bean實(shí)例的相對(duì)應(yīng)的成員變量中,而EjbStore()方法則把成員變量中的數(shù)據(jù)保存到相應(yīng)的數(shù)據(jù)庫字段中去。由EJB容器決定在什么時(shí)候調(diào)用這兩個(gè)方法。 3. Entity Bean的一些特點(diǎn)的一些特點(diǎn) 多個(gè)Entity Bean可能同時(shí)代表同一個(gè)數(shù)據(jù)記錄 在EJB中session bean、entity bean 和message_driven bean的實(shí)例都是單線程的。因?yàn)檫@一限制使得一個(gè)Bean實(shí)例在同一時(shí)刻只能服務(wù)于一個(gè)客戶端,所以EJB容器允許在需要的時(shí)候初始化多個(gè)相同的Bean實(shí)例,而每一個(gè)Bean實(shí)例的數(shù)據(jù)源都是一樣的。

6、數(shù)據(jù)的同步也是有EJB容器自動(dòng)完成的。 3. Entity Bean的一些特點(diǎn)的一些特點(diǎn) Entity Bean池 通常EJB容器會(huì)根據(jù)設(shè)置預(yù)先初始化幾個(gè)Bean實(shí)例,并把它們放到一個(gè)Bean池中,當(dāng)需要使用它們時(shí),才把相關(guān)的數(shù)據(jù)讀入其中,客戶端調(diào)用完后,并不馬上銷毀它們,而是繼續(xù)讓它們留在Bean池中,當(dāng)新的請(qǐng)求到達(dá)時(shí),再把實(shí)例和相關(guān)的EJB對(duì)象關(guān)聯(lián)起來,并把數(shù)據(jù)讀入其中。3. Entity Bean的一些特點(diǎn)的一些特點(diǎn) Entity Bean池 Entity Bean在進(jìn)出Bean池時(shí)也有激活(Activated)和鈍化(Passivated)。Entity Bean的激活(Activat

7、ed)和鈍化(Passivated)還需要調(diào)用ejbStore() 和ejbLoad()方法來保存Bean的狀態(tài)。 3. Entity Bean的一些特點(diǎn)的一些特點(diǎn) 有兩種方法處理Entity Bean的數(shù)據(jù)存儲(chǔ)方式 BMP(Bean-managed Persistence)是Bean自己管理的存儲(chǔ)方式。 CMP (Container- managed Persistence)是由容器來管理的存儲(chǔ)方式。 3. Entity Bean的一些特點(diǎn)的一些特點(diǎn) Entity Bean的創(chuàng)建和刪除和Session Bean是不同的 ejbCreare() 方法中要執(zhí)行數(shù)據(jù)庫的插入操作,而在ejbremo

8、ve()方法中則執(zhí)行數(shù)據(jù)庫的刪除操作,Home對(duì)象的creare()方法必須把相應(yīng)的字段值傳給ejbCreare()方法。creare()方法返回的是remote接口,也就是EJB對(duì)象。 3. Entity Bean的一些特點(diǎn)的一些特點(diǎn) Entity Bean的查找 Entity Bean提供了許多ejbFinder方法,同時(shí)在Home接口中也對(duì)應(yīng)著有一系列的Finder方法,客戶端獲取了對(duì)Home對(duì)象的引用后,就直接調(diào)用Home對(duì)象的Finder方法,F(xiàn)inder方法從數(shù)據(jù)庫中找到對(duì)應(yīng)的數(shù)據(jù)后,就返回一個(gè)相對(duì)應(yīng)的EJB對(duì)象。 3. Entity Bean的一些特點(diǎn)的一些特點(diǎn) Entity B

9、ean上下文對(duì)象 對(duì)于Entity Bean,context對(duì)象實(shí)現(xiàn)的接口是javax.ejb.EntityContext,它是從 javax.ejb.EJBContext 繼承來的。 13.2 BMP Entity Bean BMP(Bean-managed Persistent Entity Bean)需要Bean自己完成數(shù)據(jù)的存取操作,也就是說需要編程來實(shí)現(xiàn)從Entity Bean到數(shù)據(jù)庫的映射,通常需要使用數(shù)據(jù)庫API(JDBC或SQL/J)進(jìn)行編程。 13.2 BMP Entity Bean 1. Entity Bean 基礎(chǔ) 2. Entity Bean的finder方法 3. B

10、MP實(shí)例Account Bean 4. BMP Entity Bean的生命周期 1. Entity Bean 基礎(chǔ)基礎(chǔ) 一 個(gè) E n t i t y B e a n 類 必 須 實(shí) 現(xiàn)javax.ejb.EntityBean接口,這個(gè)接口定義了很多Bean類必須實(shí)現(xiàn)的方法,EJB容器需要使用這些方法來對(duì)Entity Bean進(jìn)行管理。1. Entity Bean基礎(chǔ)基礎(chǔ) javax.ejb.EntityBean:public interface javax.ejb.EntityBean implements javax.ejb.EnterpriseBean public void setE

11、ntityContext(javax.ejb.EntityContext); public void unsetEntityContext(); public void ejbRemove(); public void ejbActivate(); public void ejbPassivate(); public void ejbLoad(); public void ejbStore();1. Entity Bean基礎(chǔ)基礎(chǔ) 除了這些方法,還需要實(shí)現(xiàn)一些創(chuàng)建Entity Bean和查找Entity Bean的方法。無論是BMP還是CMP,都需要實(shí)現(xiàn)這些方法。 1. Entity Bean

12、基礎(chǔ)基礎(chǔ) SetEntityContext() EJB容器初始化一個(gè)新的Entity Bean實(shí)例時(shí),EJB容器會(huì)調(diào)用這個(gè)方法。這個(gè)方法把新建的Bean實(shí)例和一個(gè)Context對(duì)象聯(lián)系起來。EJB容器調(diào)用這個(gè)方法的時(shí)候,這個(gè)Bean實(shí)例還只存在于Bean池中,實(shí)例中還沒有任何數(shù)據(jù),它也沒有與具體的EJB對(duì)象相關(guān)聯(lián)。 1. Entity Bean基礎(chǔ)基礎(chǔ) EjbFind() 可以使用這個(gè)方法找到一個(gè)或多個(gè)已經(jīng)存在的Entity Bean數(shù)據(jù)實(shí)例。用戶至少需要實(shí)現(xiàn)一個(gè)finder方法,那就是ejbFindByPrimaryKey(),這個(gè)方法把數(shù)據(jù)實(shí)例的主鍵或主鍵類返回給EJB容器,EJB容器會(huì)根

13、據(jù)具體情況初始化一個(gè)或多個(gè)Bean實(shí)例,然后創(chuàng)建EJB對(duì)象,并與Bean實(shí)例相關(guān)聯(lián),最后把EJB對(duì)象的引用返回給客戶端。在容器完成對(duì)這個(gè)方法的調(diào)用以后,Bean實(shí)例就不在Bean池中了,它們被綁定到相應(yīng)的EJB對(duì)象上。 1. Entity Bean基礎(chǔ)基礎(chǔ) EjbHome() 有時(shí)候需要對(duì)多個(gè)Entity Bean的數(shù)據(jù)實(shí)例進(jìn)行操作。Home方法是Bean實(shí)例的特殊方法,用戶可以調(diào)用存在于池中的任何一個(gè)實(shí)例來完成操作。 1. Entity Bean基礎(chǔ)基礎(chǔ) EjbCreate() 如果客戶端調(diào)用home 對(duì)象的create方法,相應(yīng)地會(huì)在數(shù)據(jù)庫中插入一條新的記錄,然后EJB容器會(huì)新建一個(gè)EJB

14、對(duì)象,并把這個(gè)對(duì)象和某個(gè)Bean實(shí)例相關(guān)聯(lián),在這個(gè)Bean實(shí)例中保存著新插入的數(shù)據(jù)。在容器完成對(duì)這個(gè)方法的調(diào)用的時(shí)候,Bean實(shí)例就不在Bean池中了,它已經(jīng)包含了新建的數(shù)據(jù),并與某個(gè)EJB對(duì)象相關(guān)聯(lián)。這個(gè)方法同時(shí)把EJB對(duì)象的引用返回個(gè)客戶端。 1. Entity Bean基礎(chǔ)基礎(chǔ) EjbPostCreate() 對(duì)應(yīng)于每一個(gè)EjbCreate方法,都需要定義響應(yīng)的ejbPostCreate方法,EJB容器在完成ejbCreate方法的調(diào)用后馬上調(diào)用ejbPostCreate方法??梢岳眠@個(gè)方法做一些針對(duì)EJB對(duì)象的初始化工作,還可以使用這個(gè)方法重新設(shè)定一些與事務(wù)處理相關(guān)的參數(shù)。 1. E

15、ntity Bean基礎(chǔ)基礎(chǔ) EjbActivate() 在這個(gè)方法中需要建立Bean需要的資源連接。注意:不能在這個(gè)方法中從數(shù)據(jù)庫讀數(shù)據(jù),這個(gè)任務(wù)是有ejbLoad()完成的,此外ejbActivate方法在一個(gè)事務(wù)處理的過程中是不可能會(huì)調(diào)用的。 1. Entity Bean基礎(chǔ)基礎(chǔ) EjbLoad() EJB容器通過這個(gè)方法把數(shù)據(jù)庫中的數(shù)據(jù)讀入到Bean實(shí)例中。調(diào)用Entity Bean的context對(duì)象的getPrimaryKey方法可以告訴EJB容器應(yīng)該讀取哪條數(shù)據(jù)。 1. Entity Bean基礎(chǔ)基礎(chǔ) EjbPassivate() 當(dāng)EJB容器要讓Bean實(shí)例返回到Bean池中去

16、時(shí),會(huì)調(diào)用這個(gè)方法,這叫做Bean實(shí)例的鈍化,在這個(gè)方法中需要釋放所有在ejbActivate中獲取的資源。同樣也不需要在這個(gè)方法中進(jìn)行數(shù)據(jù)的保存工作,這個(gè)工作是有ejbStore()完成的。這個(gè)方法在一個(gè)事務(wù)處理的過程中也不會(huì)被調(diào)用。 1. Entity Bean基礎(chǔ)基礎(chǔ) EjbRemove() 調(diào)用這個(gè)方法將刪除數(shù)據(jù)庫中相應(yīng)的數(shù)據(jù)記錄,但是Bean實(shí)例卻不會(huì)被刪除。用戶需要調(diào)用EntityContext對(duì)象的getPrimaryKey方法告訴EJB容器應(yīng)該刪除哪條數(shù)據(jù)記錄。 1. Entity Bean基礎(chǔ)基礎(chǔ) unsetEntityContext() 這個(gè)方法的調(diào)用意味著Bean實(shí)例即將

17、被刪除,這個(gè)實(shí)例不再和某個(gè)context對(duì)象相關(guān)聯(lián),在這個(gè)方法里需要釋放所有Bean實(shí)例用到的資源,然后這個(gè)Bean實(shí)例就等著進(jìn)回收站了。 2. Entity Bean的的finder方法方法 編寫finder方法必須遵循的規(guī)則: 所有的finder方法是以”ejbFind”開頭的。 至少應(yīng)該有一個(gè)ejbFindByPrimaryKey方法。 可以定義很多finder方法,不同的finder方法的參數(shù)和名稱各不相同。 一個(gè)finder方法要么返回一個(gè)主鍵或主鍵類,要么返回主鍵或主鍵類的集合。 2. Entity Bean的的finder方法方法 客戶端并不會(huì)直接調(diào)用Bean實(shí)例的這些finde

18、r方法,而是通過home對(duì)象來間接調(diào)用,也就是說對(duì)應(yīng)每一個(gè)ejbFind方法,在home接口中都需要定義相應(yīng)的finder方法,參數(shù)必須與Bean類中定義的一樣,home接口中的finder方法返回對(duì)EJB對(duì)象的引用。home接口中的finder方法名以”Find”開頭,少了“ejb”三個(gè)字母。3. BMP實(shí)例實(shí)例Account Bean 略略4. BMP Entity Bean的生命周期的生命周期 1) 首先并沒有任何Bean存在,EJB容器根據(jù)需要,通過newInstance()方法調(diào)用Bean的構(gòu)造函數(shù),初始化一個(gè)新的Bean實(shí)例,然后容器調(diào)用setEntityContext()方法把這

19、個(gè)Bean實(shí)例和一個(gè)Context對(duì)象關(guān)聯(lián)起來,這個(gè)Context對(duì)象包含有Bean運(yùn)行所需要的環(huán)境信息。4. BMP Entity Bean的生命周期的生命周期 2) 這個(gè)時(shí)候Bean實(shí)例已經(jīng)位于Bean池中,但是還沒有讀入任何數(shù)據(jù),也沒有獲得Bean所需要的資源,當(dāng)然也沒有任何EJB對(duì)象和它關(guān)聯(lián)。客戶端在這個(gè)時(shí)候可以調(diào)用Bean的創(chuàng)建和查找方法,還可以調(diào)用Bean的ejbHome方法,這些方法都是獨(dú)立于具體的數(shù)據(jù)實(shí)例的。4. BMP Entity Bean的生命周期的生命周期 2) 如果容器需要對(duì)Bean池進(jìn)行調(diào)整,它可以在這個(gè)時(shí)候刪除這個(gè)Bean實(shí)例,容器通過調(diào)用unsetEntityC

20、ontext()方法告訴Bean實(shí)例它將被刪除,然后容器會(huì)釋放所有對(duì)該實(shí)例的引用,最后 B e a n 實(shí) 例 被 徹 底 刪 除 。 所 以 在unsetEntityContext()方法中要執(zhí)行和setEntityContext()方法相反的操作,為刪除做準(zhǔn)備。4. BMP Entity Bean的生命周期的生命周期 3) 客戶端如果調(diào)用home對(duì)象的create()方法,容器首先從Bean池中取出一個(gè)實(shí)例,然后調(diào)用Bean實(shí)例的ejbCreate()方法,這個(gè)方法新建了一個(gè)數(shù)據(jù)實(shí)例,并向數(shù)據(jù)庫中插入一條新記錄,最后容器新建一個(gè)EJB對(duì)象,并把對(duì)EJB對(duì)象的引用返回給客戶端。從這個(gè)時(shí)候開始

21、Bean實(shí)例處于“ready”狀態(tài)。4. BMP Entity Bean的生命周期的生命周期 4) Bean實(shí)例在處于“ready”狀態(tài)的時(shí)候,它被綁定到一個(gè)數(shù)據(jù)實(shí)例和EJB對(duì)象上。如果同時(shí)還有其他 Bean 實(shí)例對(duì)應(yīng)同一個(gè)數(shù)據(jù)實(shí)例,容器會(huì)負(fù)責(zé)在適當(dāng)?shù)臅r(shí)候調(diào)用ejbLoad()和ejbStore()方法來保持?jǐn)?shù)據(jù)的同步。 4. BMP Entity Bean的生命周期的生命周期 5) 如果客戶端調(diào)用home對(duì)象的remove()方法,容器會(huì)調(diào)用Bean實(shí)例的ejbRemove()方法,這個(gè)方法將刪除數(shù)據(jù)庫中對(duì)應(yīng)的記錄,至此,Bean實(shí)例不再和任何EJB對(duì)象相關(guān)聯(lián),并退回到Bean池中,注意這里

22、并沒有把Bean實(shí)例刪除,而是刪掉了數(shù)據(jù)實(shí)例。 4. BMP Entity Bean的生命周期的生命周期 6) 如果EJB容器發(fā)現(xiàn)分配給某個(gè)客戶端的時(shí)間已經(jīng)用完,或者容器需要使用這個(gè)Bean實(shí)例服務(wù)于其他客戶端,或者容器已經(jīng)耗盡了資源,那么當(dāng)前Bean實(shí)例將會(huì)被鈍化(Passivate),在調(diào)用鈍化方法之前,EJB容器首先調(diào)用ejbStore()以保證數(shù)據(jù)庫中的數(shù)據(jù)是最新的,鈍化之后,Bean實(shí)例就回到了Bean池中。 4. BMP Entity Bean的生命周期的生命周期 7) 如果容器又決定把這個(gè)到Bean實(shí)例分配給其他客戶端,也就是讓它和一個(gè)新的EJB對(duì)象相關(guān)聯(lián),那么容器首先需要激活B

23、ean實(shí)例。容器在調(diào)用ejbActivate()之后會(huì)調(diào)用ejbLoad()方法把數(shù)據(jù)讀入到Bean實(shí)例中。13.3 CMP Entity Bean CMP(Container-managed Persistent Entity Bean)不需要直接進(jìn)行數(shù)據(jù)庫API編碼,它的數(shù)據(jù)庫存取是由容器來完成的。13.3 CMP Entity Bean 1. CMP Entity Bean的特點(diǎn) 2. 編寫CMP Entity Bean的基本規(guī)則4. CMP實(shí)例User5. CMP Entity Bean的生命周期 3. JBOSS4.0配置1. CMP Entity Bean的特點(diǎn) 1)數(shù)據(jù)處理邏輯和

24、數(shù)據(jù)存取邏輯的分離 首先你需要編寫一個(gè)不包含任何存取邏輯(JDBC代碼)的Entity Bean,然后容器自動(dòng)從你定義的這個(gè)Bean類繼承,并生成一個(gè)子類,容器在這個(gè)子類中嵌入了由容器自動(dòng)生成的JDBC代碼,這就是CMP,由容器來完成數(shù)據(jù)存取邏輯,而數(shù)據(jù)處理邏輯則由你定義的父類完成。所以CMP Entity Bean實(shí)際上包含兩個(gè)Bean類,一個(gè)是用戶定義的父類,另一個(gè)則是由容器生成的子類,在子類中封裝有數(shù)據(jù)的存取邏輯。1. CMP Entity Bean的特點(diǎn) 2)與數(shù)據(jù)庫字段相對(duì)應(yīng)的成員變量在子類中定義 CMP Entity Bean類是在它的子類中定義這些成員變量的。因?yàn)椴煌腅JB容器

25、對(duì)數(shù)據(jù)的表達(dá)方式不一樣,另外數(shù)據(jù)的表達(dá)也應(yīng)該和數(shù)據(jù)的存取邏輯放在一塊,這樣進(jìn)一步體現(xiàn)數(shù)據(jù)的處理邏輯和數(shù)據(jù)的存取邏輯的分離。 1. CMP Entity Bean的特點(diǎn) 3)get/set方法也在子類中定義 和代表數(shù)據(jù)的成員變量一樣,這些變量的get/set方法也是在子類中定義的。為了能夠在父類中調(diào)用子類中的方法,必須要在父類中把相關(guān)的方法定義為abstract。 1. CMP Entity Bean的特點(diǎn) 4)部署描述文件在CMP中的作用 在CMP中,EJB容器通過部署描述文件獲取相關(guān)的信息來產(chǎn)生數(shù)據(jù)成員變量、get/set方法和JDBC編碼。 1. CMP Entity Bean的特點(diǎn) 5)

26、EJB查詢語言 EJB查詢語言(EJB-QL)是一種面向?qū)ο蟮牟樵冋Z言,它的基本語法和SQL很相似。在部署文件中定義EJB-QL語言,EJB容器通過這些語言來生成相應(yīng)的JDBC代碼。 1. CMP Entity Bean的特點(diǎn) 6)ejbSelect()方法 CMP Entity Bean有一個(gè)專門的ejbSelect()方法,這個(gè)方法并不向客戶端開放,它是一個(gè)內(nèi)部方法,這個(gè)方法在處理Bean之間的關(guān)系是非常有用。 2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則1)SetEntityContext() 和BMP一樣,EJB容器初始化一個(gè)新的Entity Bean實(shí)例時(shí),EJB容

27、器會(huì)調(diào)用這個(gè)方法。這個(gè)方法把新建的Bean實(shí)例和一個(gè)Context對(duì)象聯(lián)系起來。EJB容器調(diào)用這個(gè)方法的時(shí)候,這個(gè)Bean實(shí)例還只存在于Bean池中,實(shí)例中還沒有任何數(shù)據(jù),它也沒有與具體的EJB對(duì)象相關(guān)聯(lián)。2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則2)ejbFind() 對(duì)于CMP,用戶不需要實(shí)現(xiàn)這些方法,當(dāng)客戶端調(diào)用home對(duì)象的finder方法時(shí),EJB通過EJB-QL和其他一些工具來告訴容器如何完成查找工作。2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則3) ejbSelect() 客戶端不用調(diào)用這些方法, 這些方法是輔助Bean進(jìn)行內(nèi)部查詢用的,通常

28、需要定義為abstract型。2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則4)EjbHome() 這些操作對(duì)象并不是哪個(gè)單獨(dú)的數(shù)據(jù)實(shí)例,而是很多數(shù)據(jù)實(shí)例,客戶端調(diào)用這些方法的時(shí)候,Bean實(shí)例可能還位于Bean池中。2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則5)EjbCreate() 當(dāng)客戶端調(diào)用這些方法的時(shí)候,會(huì)新生成一個(gè)數(shù)據(jù)實(shí)例,也就是說會(huì)在數(shù)據(jù)庫中插入一條新記錄。對(duì)于CMP,用戶不需要像BMP那樣進(jìn)行JDBC數(shù)據(jù)插入操作,而是簡單的檢查一下傳入的參數(shù)是否正確,然后把值傳給相應(yīng)的成員變量。2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則6

29、)EjbPostCreate() 對(duì) 應(yīng) 于 每 一 個(gè) E j b C r e a t e 方 法 , 都 有 一 個(gè)EjbPostCreate方法,容器在調(diào)用完EjbCreate方法后,馬上就調(diào)用EjbPostCreate方法,這個(gè)時(shí)候Bean實(shí)例已經(jīng)和一個(gè)EJB對(duì)象關(guān)聯(lián)起來了,用戶就馬上可以在這個(gè)方法中做一些跟EJB對(duì)象相關(guān)的初始化工作。 2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則7)EjbActivate() 如果客戶端調(diào)用某個(gè)EJB對(duì)象的方法,但是這個(gè)EJB對(duì)象卻還沒有和Bean實(shí)例相關(guān)聯(lián),容器就會(huì)從Bean池中取出一個(gè)來,這叫做Bean的激活,在這個(gè)方法中需要獲

30、取Bean要用到的一些資源。2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則8)EjbLoad() 用戶不需要像BMP那樣在這個(gè)方法進(jìn)行數(shù)據(jù)庫的讀操作,EJB容器在調(diào)用這個(gè)方法之前自動(dòng)從數(shù)據(jù)庫中讀入相關(guān)字段的值。當(dāng)然這并不意味著這個(gè)方法就沒有什么用了,你可以在這個(gè)方法中對(duì)讀入的數(shù)據(jù)做一些加工。2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則9)EjbPassivate() 如果容器調(diào)用這個(gè)方法,Bean實(shí)例就返回到Bean池中去了,這叫做Bean實(shí)例的鈍化,在這個(gè)方法中需要釋放所有在ejbActivate中獲取的資源。 2.編寫編寫CMP Entity Bean的基

31、本規(guī)則的基本規(guī)則10)EjbRemove() 如果客戶端調(diào)用這個(gè)方法,容器會(huì)刪除相應(yīng)的數(shù)據(jù)實(shí)例,也就是刪除數(shù)據(jù)庫中的當(dāng)前記錄,但不會(huì)刪除Bean實(shí)例,Bean實(shí)例可以返回到Bean池中供其他客戶端使用。和BMP不同,在這個(gè)方法中用戶不需要編碼進(jìn)行數(shù)據(jù)庫的刪除操作,而只需要做一些刪除數(shù)據(jù)之前的準(zhǔn)備工作,容器在調(diào)用完這個(gè)方法后馬上自動(dòng)完成刪除操作。2.編寫編寫CMP Entity Bean的基本規(guī)則的基本規(guī)則11)unsetEntityContext() 調(diào)用這個(gè)方法意味著Bean實(shí)例要被刪除了,這個(gè)時(shí)候Bean實(shí)例不再和context對(duì)象相關(guān)聯(lián),在這個(gè)方法中需要釋放所有在setEntityCon

32、text方法中獲取的資源。 3. JBOSS4.0JBOSS4.0配置配置(1)(1)創(chuàng)建創(chuàng)建jboss_homeserverdefaultdeploymysql-ds.xmljboss_homeserverdefaultdeploymysql-ds.xml。(2) mysql-connector-java-5.0.8-bin.jar(2) mysql-connector-java-5.0.8-bin.jar復(fù)制到復(fù)制到 jboss_homeserverdefaultlib jboss_homeserverdefaultlib文件夾下。文件夾下。3. JBOSS4.0JBOSS4.0配置配置(

33、3) 編輯編輯JBoss安裝目錄安裝目錄/server/default/deploy/conf/login-config.xml: login-module code = flag = required guest guest guest guest guest guest module-option name = jboss.jca:service=TxCM,name=JmsXAjboss.jca:service=TxCM,name=JmsXAdule-option 3. JBOSS4.0JBOSS4.0配置配置 login-module code = flag = required tes

34、ttest rootroot zm661068zm661068/module-option module-option name = jboss.jca:service=LocalTxCM,name=managedConnectionFactoryNamejboss.jca:service=LocalTxCM,name=MySqlDSMySqlDS 3. JBOSS4.0JBOSS4.0配置配置(4) 編輯編輯JBoss安裝目錄安裝目錄/server/default/deploy/conf/standardjaws.xml: java:/DefaultDS java:/DefaultDS Hy

35、personic SQL Hypersonic SQL false false 3. JBOSS4.0JBOSS4.0配置配置 java:/ java:/MySqlDSMySqlDS mySQLmySQL false false3. JBOSS4.0JBOSS4.0配置配置(5) 編輯編輯JBoss安裝目錄安裝目錄/server/default/deploy/conf/standardjbosscmp-jdbc.xml: java:/DefaultDS java:/DefaultDS 3. JBOSS4.0JBOSS4.0配置配置 java:/ java:/MySqlDSMySqlDS4. C

36、MP實(shí)例實(shí)例User Bean 1. User.java2. UserHome.java3. UserBean.java4. CMP實(shí)例實(shí)例User Bean 新建一個(gè) Lomboz J2EE Project: 項(xiàng)目名:CMP_Sample EJB Modules:cmpEJB Targeted Server: JBoss 4.0.44. CMP實(shí)例實(shí)例User Bean 繼續(xù)在繼續(xù)在 CMP_Sample CMP_Sample 項(xiàng)目中,右擊項(xiàng)目中,右擊“srcsrc” - -新新建建 -其它其它 - Lomboz EJB Creation Wizard :- Lomboz EJB Creat

37、ion Wizard : 包(包(K K) :ejb.cmpejb.cmp 名稱(名稱(M M):): UserUser EJB Type EJB Type:選擇選擇ContainerContainerManaged EntityManaged EntityEJBEJB 點(diǎn)擊下一步。點(diǎn)擊下一步。4. CMP實(shí)例實(shí)例User Bean 4. CMP實(shí)例實(shí)例User Bean 同樣,再增加一個(gè)密碼欄:同樣,再增加一個(gè)密碼欄: Field: password, Field: password, Field Type: java.lang.String, Field Type: java.lang.S

38、tring, Database Column: Database Column: 密碼密碼, , SQL Type: varchar SQL Type: varchar 這個(gè)不要使它成為主鍵。這個(gè)不要使它成為主鍵。 最后點(diǎn)擊完成。最后點(diǎn)擊完成。4. CMP實(shí)例實(shí)例User Bean 修改生成的修改生成的 UserBean.java UserBean.java 文件,先添加自動(dòng)創(chuàng)建表的語句文件,先添加自動(dòng)創(chuàng)建表的語句 4. CMP實(shí)例實(shí)例User Bean 4. CMP實(shí)例實(shí)例User Bean 完成完成 ejbCreate ejbCreate 和和 ejbPostCreate ejbPostC

39、reate 方法:方法:4. CMP實(shí)例實(shí)例User Bean 在上面的在上面的 ejb.bean ejb.bean 中添加中添加 view-type = view-type = locallocal 4. CMP實(shí)例實(shí)例User Bean 試驗(yàn)各種配置: 先將 UserBean.java 添加到 cmpEJB 模塊中,然后 lomboz -Generate EJB Classes Generate EJB Classes 生成其它ejb類文件。 運(yùn)行 MySQl 服務(wù),再通過 Lomboz 啟動(dòng) JBoss 服務(wù)器。 通過 Deploy ModuleDeploy Module 部署 cmpE

40、JB 模塊,再打開MySql的客戶端,會(huì)發(fā)現(xiàn)在 cmp_sample 數(shù)據(jù)庫中已經(jīng)自動(dòng)生成了一個(gè) usertable 的數(shù)據(jù)表。 4. CMP實(shí)例實(shí)例UserManagementBean 右擊右擊 javamxj.ejb.cmp包包-新建新建-其它其它-還是選擇還是選擇Lomboz EJB Creation Wizard : 包(K) :javamxj.ejb.cmp 名稱(M): UserManagement EJB Type: 選擇 Stateless 然 后 , 點(diǎn) 擊 “ 完 成 ” , 這 時(shí) 會(huì) 生 成 一 個(gè) UserManagementBean.java 的文件。4. CMP實(shí)

41、例實(shí)例UserManagementBean 首先,增加一個(gè) UserLocalHome 的變量 userHome, private UserLocalHome userHome = null; 然后右擊 UserManagementBean -J2EE -Add Create Method(這是 JBossv-IDE 附帶的):4. CMP實(shí)例實(shí)例UserManagementBean4. CMP實(shí)例實(shí)例UserManagementBean4. CMP實(shí)例實(shí)例UserManagementBean在生成的代碼框中添加語句:在生成的代碼框中添加語句:userHome = UserUtil.getLo

42、calHome();userHome = UserUtil.getLocalHome(); 如下圖:需要手工輸入的語句已經(jīng)標(biāo)出來了:如下圖:需要手工輸入的語句已經(jīng)標(biāo)出來了:4. CMP實(shí)例實(shí)例UserManagementBean添加業(yè)務(wù)方法:添加業(yè)務(wù)方法: 增 加增 加 a d d U s e r 方 法 , 向 上 面 操 作 一 樣 , 右 擊方 法 , 向 上 面 操 作 一 樣 , 右 擊UserManagementBean-J2EE-AddBusinessMethod: 4. CMP實(shí)例實(shí)例UserManagementBean在生成的代碼框中添加語句:在生成的代碼框中添加語句:Use

43、rLocal user = userHome.create(email, password);UserLocal user = userHome.create(email, password); 增加增加 removeUser removeUser 方法方法 4. CMP實(shí)例實(shí)例UserManagementBean在生成的代碼框中添加語句:在生成的代碼框中添加語句:userHome.remove(email);userHome.remove(email); 增加增加verifyPassword verifyPassword 方法方法 4. CMP實(shí)例實(shí)例UserManagementBean在生

44、成的代碼框中添加語句:在生成的代碼框中添加語句:UserLocal user = userHome.findByPrimaryKey(email);UserLocal user = userHome.findByPrimaryKey(email);return user.getPassword().equals(password);return user.getPassword().equals(password); 為了將為了將 UserBean UserBean 與與 UserManagementBean UserManagementBean 聯(lián)系起來,在上面聯(lián)系起來,在上面注釋中添加:注

45、釋中添加:* * view-type = remoteview-type = remote * * ejb.ejb-ref ejb.ejb-ref * * ejb-name = Userejb-name = User“* * view-type = local view-type = local“* * ref-name = ejb/UserLocal ref-name = ejb/UserLocal* * jboss.ejb-local-ref jboss.ejb-local-ref * * ref-name = UserLocalref-name = UserLocal * * jndi-

46、name = UserLocal jndi-name = UserLocal 4. CMP實(shí)例實(shí)例UserManagementBean 4. CMP實(shí)例實(shí)例UserManagementBean 將 UserManagementBean 加入到 cmpEJB 模塊中, 然后 lomboz -Generate EJB Classes 運(yùn)行 MySQl 服務(wù),再通過 Lomboz 啟動(dòng) JBoss 服務(wù)器。 然后通過 Deploy Module 部署 cmpEJB 模塊 4. CMP實(shí)例實(shí)例CMPClient1 右擊右擊 srcsrc文件夾文件夾 -新建新建 -其它其它- Lomboz EJB -

47、Lomboz EJB Test ClientTest Client Wizard: Wizard: 4. CMP實(shí)例實(shí)例CMPClient1 修改生成的修改生成的 CMPClient1.javaCMPClient1.java4. CMP實(shí)例實(shí)例CMPClient1 運(yùn)行客戶端程序,則客戶端控制臺(tái)會(huì)輸出:運(yùn)行客戶端程序,則客戶端控制臺(tái)會(huì)輸出:Login=true 同 時(shí) , 用同 時(shí) , 用 M y S Q L 客 戶 端 軟 件 查 看客 戶 端 軟 件 查 看cmp_sample表。表。5. CMP Entity Bean的生命周期的生命周期 CMP Entity Bean的生命周期和BMP

48、 Entity Bean的生命周期基本一樣,唯一的不同就是CMP實(shí)體Bean的ejbSelect()方法能夠從池化狀態(tài)或就緒狀態(tài)被調(diào)用。13.4 EJB QL語言語言 EJB 查詢語言 (EJB QL: Enterprise JavaBean Query Language) 規(guī)定了持久性管理器應(yīng)該如何實(shí)現(xiàn)在本地接口中定義的各種查找方法。 EJB QL 以 SQL-92 為基礎(chǔ),可由持久性管理器自動(dòng)編譯,這使得實(shí)體 bean 具有更高的可移植性,并且更容易部署。 13.4 EJB QL語言語言EJBQL語法語法Finder方法方法Select方法方法FROM子句子句WHERE子句子句6.SELE

49、CT子句子句7.EJBQL和查找方法和查找方法8.EJBQL和選擇方法和選擇方法1. EJB QL 語法語法 EJB QL定義了使用抽象模式名稱和關(guān)聯(lián)進(jìn)行導(dǎo)航的查詢。 EJB QL = select子句 from子句 where子句 其中from子句為引導(dǎo)模式,聲明了抽象模式名字的識(shí)別變量。通過這些識(shí)別變量, select子句定義了查詢的返回類型, where子句定義了查詢條件。 2. Finder 方法方法 finder方法從持久化存儲(chǔ)的關(guān)系數(shù)據(jù)庫內(nèi)獲取一個(gè)實(shí)體Bean個(gè)體和集合。這些方法定義在實(shí)體Bean的home接口中。因此,它們對(duì)客戶端是可見的。 3. Select 方法方法 sele

50、ct方法是實(shí)體Bean中的特殊的查詢方法。它們沒有在home接口內(nèi)聲明,因此,它們對(duì)客戶端是不可見的。Select方法通常有兩種形式:ejbSelectejbSelectInEntity 3. Select 方法方法 Select方法通常有兩種形式: ejbSelect ejbSelectInEntityejbSelect方法不跟特定的實(shí)體Bean實(shí)例發(fā)生聯(lián)系。ejbSelect InEntity方法是跟特定于實(shí)體Bean的執(zhí)行實(shí)例的。 4. FROM 子句子句 from子句通過聲明識(shí)別變量定義了查詢域。識(shí)別變量 不能在SELECT子句和WHERE子句內(nèi)聲明。 SELECT子句和WHERE子句

51、只能使用這些定義在FROM子 句內(nèi)的識(shí)別變量。 FROM子句可以定義多個(gè)識(shí)別變量。識(shí) 別變量的名稱不應(yīng)該跟抽象模式的名稱或EJB的名稱相同 。識(shí)別變量也不允許是保留字。識(shí)別變量聲明由范圍變 量聲明和集合成員聲明。4. FROM 子句子句 4. FROM 子句子句 例:找出所有的軟盤驅(qū)動(dòng)器產(chǎn)品的訂單: SELECT OBJECT(o) FROM Order o,IN(o.lineItems)li WHERE duct_type=“fFloppy Drive” FROM子句聲明了標(biāo)識(shí)符“o”為一個(gè)范圍變量,“l(fā)i” 為一個(gè)集合成員變量。5. WHERE 子句子句 WHE

52、RE子句定義了SELECT表達(dá)式的條件。在EJB QL中, WHERE子句所有識(shí)別變量必須在FROM子句內(nèi)聲明。也可以為finder和select方法傳遞輸入?yún)?shù)。如:SELECT OBJECT(o) FROM Order o,IN(o.lineItems)li WHERE li.quantity=?1SELECT OBJECT(o) FROM Order o,IN(o.lineItems)li WHERE duct_type= ?1 AND duct.price=?26. SELECT 子句子句 SELECT子句指示了查詢的執(zhí)行結(jié)果。 SELECT子句決定查詢返回值的類型。如:SELECT OBJECT(o) FROM Order o

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論