在以后的日子里,將由Jackliu向大家陸續(xù)提供一系列EJB教程,有學(xué)習(xí)EJB的朋友請(qǐng)同步參考EJB相關(guān)書籍,實(shí)戰(zhàn)系列將以例程的方式幫助你理解這些基本的概念,其中將包括:
![]()
點(diǎn)擊查看大圖 所有章節(jié)完畢后將制作成pdf電子文檔,供大家下載
實(shí)戰(zhàn)EJB之五 開發(fā)實(shí)體BMP(EJB 1.1規(guī)范)
前一節(jié)介紹了EntityBean的有關(guān)介紹,并通過開發(fā)、部署實(shí)體CMP的例子介紹EJB1.1規(guī)范的CMP的有關(guān)特性,在這一節(jié)中你將了解如下內(nèi)容:
根據(jù)規(guī)范中定義的EJB事務(wù)持久性(persistence)的特性被分為容器治理持久性(CMP)和Bean治理持久性(BMP)。雖然使用容器治理持久性給編程帶來極大的方便,但是將事務(wù)持久性交于容器來控制降低了Bean的開發(fā)能力;BMP的Bean具有靈活的業(yè)務(wù)處理能力和更靈活的持久性控制能力,常用來映射一些復(fù)雜的數(shù)據(jù)視圖或很難用CMP實(shí)現(xiàn)的復(fù)雜邏輯處理。
BMP的壽命周期和CMP的壽命周期治理機(jī)制是相同的,不同的是BMP的事務(wù)持久性治理機(jī)制交于Bean開發(fā)者,所以,在創(chuàng)建、更新、刪除等數(shù)據(jù)庫(kù)操作時(shí),兩種類型的Bean的順序圖是不一樣的。為了說明這一點(diǎn),可以從CMP和BMP在鈍化/激活順序圖中分析,當(dāng)然Bean的創(chuàng)建、查找、刪除也是不同的:
通過圖5-1和5-2的比較,我們很輕易會(huì)發(fā)現(xiàn):
CMP:當(dāng)一個(gè)Bean實(shí)例被客戶引用,并執(zhí)行一個(gè)業(yè)務(wù)方法后,容器會(huì)自動(dòng)讀取Bean的實(shí)例字段(還記得我們?cè)谏弦还?jié)在實(shí)現(xiàn)一個(gè)CMP時(shí),為Bean定義了映射到數(shù)據(jù)庫(kù)字段的Public型類字段嗎),然后,通過容器與數(shù)據(jù)庫(kù)發(fā)生關(guān)系,保存改變的數(shù)據(jù),執(zhí)行完畢后Bean被鈍化,并調(diào)用ejbPassviate()方法通知Bean。當(dāng)客戶過一端時(shí)間又調(diào)用這個(gè)Bean的某業(yè)務(wù)方法時(shí),被鈍化的Bean又重新的激活,但是并不是馬上執(zhí)行這個(gè)業(yè)務(wù)方法,而是由EJB對(duì)象首先調(diào)用ejbActivate()方法通知Bean,Bean實(shí)例要激活,然后從數(shù)據(jù)庫(kù)中提取數(shù)據(jù),并自動(dòng)將數(shù)據(jù)值映射到Bean實(shí)例,然后調(diào)用ejbLoad()方法,實(shí)例被再一次初始化,最后才開始執(zhí)行要執(zhí)行的業(yè)務(wù)方法,紅色箭頭和紅色時(shí)間塊做了明顯的表示。
BMP:當(dāng)一個(gè)Bean實(shí)例被客戶引用,并執(zhí)行一個(gè)業(yè)務(wù)方法后,容器會(huì)執(zhí)行Bean的ejbStore()方法,并由這個(gè)方法把數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中(下面的例子你將會(huì)發(fā)現(xiàn),我們不再為
Bean定義全局類變量,而是定義一些私有類變量),執(zhí)行完畢后Bean被鈍化,并調(diào)用ejbPassviate()方法通知Bean。當(dāng)客戶過一端時(shí)間又調(diào)用這個(gè)Bean的某業(yè)務(wù)方法時(shí),被鈍化的Bean又重新的激活,但是并不是馬上執(zhí)行這個(gè)業(yè)務(wù)方法,而是由EJB對(duì)象首先調(diào)用ejbActivate()方法通知Bean,Bean實(shí)例要激活,然后調(diào)用Bean的ejbLoad()方法,這個(gè)方法負(fù)責(zé)從數(shù)據(jù)庫(kù)中提取數(shù)據(jù),Bean實(shí)例被初始化,最后才開始執(zhí)行要執(zhí)行的業(yè)務(wù)方法。
<圖5-1 designtimesp=21804>
<圖5-2 designtimesp=21815>
BMP Bean要求所有的數(shù)據(jù)庫(kù)操作都要由Bean實(shí)例完成,這些方法基本上包括:
setXXX():因?yàn)锽MP不在為容器聲明public類型的由容器來治理的映射字段,所以setXX方法需要開發(fā)者實(shí)現(xiàn)
getXXX(): 取得Bean字段值
ejbCreate():在CMP中,由容器實(shí)現(xiàn),并返回一個(gè)NULL值,在BMP中必須由開發(fā)者自己實(shí)現(xiàn),返回創(chuàng)建記錄的主鍵值
ejbLoad(): 在CMP中,由容器實(shí)現(xiàn),在BMP中必須由開發(fā)者自己實(shí)現(xiàn),以實(shí)現(xiàn)組件非持久性狀態(tài)緩存持久性信息
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注