JBuilder9+Weblogic7實戰篇之Entity Bean運用篇(一) (轉)

gugu99發表於2007-08-17
JBuilder9+Weblogic7實戰篇之Entity Bean運用篇(一) (轉)[@more@]

JBuilder9+LOGIC7實戰篇:namespace prefix = o ns = "urn:schemas--com::office" />

ENTITY BEAN的運用(一)

 

作者:黃 凱   

E_:

 

一、Entity Bean 的基礎理論

1.1 什麼是Entity Bean

  Entity Bean(實體Bean)是持久資料,代表在外部介質中的持久(Persistence)或者已有的企業應用資源。簡單地講,一個Entity Bean可以代表中的一行記錄,多個客戶端應用能夠以共享方式訪問表示該資料庫記錄的Entity Bean。

  那麼什麼是持久資料元件呢?為什麼要使用持久資料元件?理解了這兩個問題,也就清楚了Entity Bean的性質及用途。

  持久資料元件指的是這樣一種物件,它們知道如何將自身放入持久儲存的空間中。它們使用一些持久機制,比如序列化、O/R對映。這種物件代表資料,例如使用持久資料元件代表下面這些資訊:

  ●  銀行帳號資訊,例如帳號、密碼和餘額;

  ●  員工資訊,例如姓名、部門和工資。

  為什麼要把這些資料以物件的方式進行處理而不是直接處理資料庫中的原始資料,比如相關的記錄呢?答案是將資料視為物件是非常便利的,因為能夠方便地操作和管理物件,並且它們表現為一個緊湊的形式,此外,透過元件所在的應用,可以獲得事務、性等服務。

  Entity Bean就是這種持久資料元件。Entity Bean知道怎樣在一個諸如資料庫的儲存空間中永久儲存自己。Entity Bean以域(field)的方式儲存資料,例如銀行帳號、密碼和餘額。

  依賴於容器提供的事務服務,多個客戶端應用能夠在保持資料庫記錄的一致性和完整性前提下實現對資料資源的共享。Entity Bean的生命期相對較長並且其狀態是持續的。只要Entity Bean代表的資料庫記錄存在,該元件物件例項就一直存在,即使EJB容器崩潰,Entity Bean仍然具有生命力。

1.2 Entity Bean的子型別

  按照Entity Bean永續性的實現形式,可以將Entity Bean分為容器管理永續性(CMP Container-Managed Persistence)和元件管理永續性(BMP Bean-Managed Persistence)兩種模型。在CMP型別EJB元件的實現程式碼中,元件開發人員不需要為元件的永續性控制方法編寫任何資料庫操作的程式碼,而是在元件組裝和部署過程中由部署工具自動建立;如果要建立BMP型別EJB元件,則元件設計人員需要為所有永續性方法編寫控制程式碼。

1.3 Entity Bean的特點

  與資料庫中的資料記錄相對應,每個實體型別EJB元件包含一個主鍵(Primary Key)標識,該標識與元件代表的資料庫記錄主鍵相同。客戶端應用可以利用該主鍵定位EJB容器中的Entity Bean物件例項,進而定位元件代表的資料庫記錄。

  實體型別EJB元件的主要特點包括:

●  Entity Bean提供資料庫中記錄的檢視;

●  Entity Bean具有無限制生命期,EJB伺服器崩潰也不會影響Entity Bean的存在;

●  多個Entity Bean可以對應同一資料庫記錄;

●  EJB伺服器可以利用Entity Bean的passivate方法將Entity Bean快取到臨時儲存空間中,同樣可以利用activate方法將快取的Entity Bean重新讀入EJB容器並恢復元件物件例項;

●  客戶端應用可以利用在Entity Bean的Home介面中定義的建立、刪除和查詢等方法對元件進行管理。

二、建立Entity Bean

2.1 準備

  首先在9i資料庫建立表student和locker,建表的指令碼如下:

  ★ student表的指令碼:

  create table student(stuid integer primary key,stuname varchar(50),lockerid integer);

  insert into student(stuid,stuname,lockerid) values(1,'student1',1);

  insert into student(stuid,stuname,lockerid) values(2,'student2',2);

  insert into student(stuid,stuname,lockerid) values(3,'student3',3);

★  locker表的指令碼:

create table locker(id integer primary key,lockername varchar(50));

insert into locker(id,lockername) values(1, 'locker1');

insert into locker(id,lockername) values(2, 'locker2');

insert into locker(id,lockername) values(3, 'locker3');

  在此之前請參照《JBuilder9+Weblogic7實戰篇之工具篇(JC 1)》好資料庫的連線池和Tx資料來源。

2.2 建立Entity Bean

2.2.1 啟動Jbuilder9,新建一個工程cmpSample

2.2.2 單擊Enterprise子頁;

2.2.3選擇EJB Module然後單擊OK,出現EJB Module視窗;

2.2.4在Name後輸入Cmp

2.2.5 將Version更改為EJB 2.0 compliant

2.2.6 單擊OK。 EJB 的設計在文件視窗中進行。

2.2.7 透過從資料庫中引入(Schema)的方式建立與student表對應的Entity Bean。在文件視窗按滑鼠右鍵,單擊Import Schema From Database選單項;

2.2.8 在“Database Schema Provr”介面中設定資料庫連線資訊。各項設定如下:

  ★ Driver: 在下拉選單中選擇oracle...OracleDriver

★  URL: jdbc:oracle:thin:@localhost:1521:kkdb

★  Username: TEST

★  Pass: TEST

★  Database name: kkdb

★  JNDI name: jdbc/testTxData

完成後可以在左側“DataSources”視窗中看見資料庫中所有表的檢視。

2.2.9 在STUDENT上按右鍵,單擊Create CMP 2.0 Entity Bean選單項,建立與student表相對應的CMP。

2.2.10 設定Entity Bean的資訊

  在EJB Designer視窗中單擊Student項,進行設定。

  在這裡,只需設定介面型別(Interfaces)為local/remote(表示同時生成兩種介面),其他各項均使用預設值即可。各項含義如下:

●  Bean name: Entity Bean的名字;

●  Abstract schema name: 抽象模式名;

●  Interfaces: 對外介面型別,選擇local、remote或local/remote;

●  Always wrap primary key: 是否總是保護主鍵;

●  Class and packages按鈕: 設定產生類名和包名

  ○ 單擊某一屬性,可以設定該屬性的資訊。例如設定屬性的名稱、資料型別、是否為主鍵、是否作為ejbCreate方法的引數等。這裡我們預設值。

2.2.11 在工程視窗cmpSample.jpx/Cmp按右鍵,單擊Make選單項,生成Cmp.jar。

2.2.12  啟動Weblogic Server

2.2.13  工程視窗cmpSample.jpx/Cmp/Cmp.jar按右鍵,單擊Deploy Options for Cmp.jar/Deploy選單項進行部署。

三、Entity Bean的組成

  Entity Bean是由Bean類和介面檔案組成。介面檔案包括對外和Home介面。對外介面有兩種:介面(Remote Interface)和本地介面(Local Interface)。Home介面是與對外介面保持一致的,即每一種對外介面對應一種Home介面。結合剛才我們建立的Entity Bean(CMP型別)的例項講解各個組成部分。

3.1 Bean類

  與Session Bean一樣,Bean類中封裝業務邏輯。在Session Bean中通常封裝的是操作,Entity Bean是代表資料的,所以Entity Bean應該封裝的是資料(或對資料的存取操作)。以Student這個CMP為例,Bean類中除了幾個EJB都要有控制EJB生命週期的方法(如ejbCreate()、ejbRemote()、ejbPostCreate())外,與具體應用相關的方法主要是一組get/set方法。每一對get/set方法對應於資料表中的一個欄位,例如student表中有一個stuid欄位,在Entity Bean中對應有一組方法setStuid()和getStuid()。

  還有一點要注意的是CMP型別的Entity Bean,其Bean類是一個實現了EntityBean介面的抽象類。裡面的方法不用開發人員自己編寫,原因是CMP的永續性操作(例如對資料庫欄位的存取)是由容器實現的。如果開發BMP,那麼Bean類就不是這種結構了,Bean類應該是實現EntityBean介面的具體類,而且要加入訪問永續性資料的程式碼(例如JDBC程式碼)。

  CMP student的Bean類的定義參見StudentBean.。

3.2 本地介面(Local Interface)

  本地介面是對外介面的一種,在Entity Bean中本地介面是比較常用的。因為在一個應用系統中,通常由Session Bean訪問Entity Bean,對於執行於同一應用伺服器中的EJB,使用本地化介面可以大大提高訪問。該介面定義了EJB的業務方法。

  CMP student的本地介面的定義參見Student.java。

3.3 遠端介面(Remote Interface)

  遠端介面是EJB的對外介面,定義了EJB的業務方法,遠端客戶端程式對EJB的訪問是透過該介面完成的。

  CMP student的遠端介面定義參見StudentRemote.java。

3.4 Home介面

  Entity Bean的Home介面定義了Entity Bean的生成及查詢操作。該介面必須定義的兩個方法是create()方法和findByPrimaryKey()方法。Create()方法定義了生成Entity Bean的操作,findByPrimaryKey()方法定義了按照主鍵查詢Entity Bean的操作。嚴格地講,這些方法僅僅定義了這些操作的一種規則,例如生成Entity Bean時的引數個數、具體實現是由容器來完成的。

  以student的Home介面為例,create()方法的定義如下:

  public Student create(BigDecimal stuid) throws CreateException;

  create()方法的引數是與student資料表的主鍵stuid對應的,因為create()方法會建立一個新的Entity Bean,相應要在資料庫中建立與Entity Bean相對應的一條記錄,記錄的stuid欄位是不可缺少的。所以create()方法其實定義了一種操作規則,即建立Entity Bean時必須含有資料表的主鍵對應的引數。

  再看一下findByPrimaryKey()方法,該方法的定義如下:

  public Student findByPrimaryKey(BigDecimal stuid) throws FinderException;

  該方法定義的是按照主鍵查詢Entity Bean的操作。如同資料庫操作中有條件查詢語句,Home介面中必須定義一個查詢操作,按照主鍵做查詢是最常用的一種查詢方式。除了findByPrimaryKey()方法,EJB開發者還可以定義其他的查詢方法,例如透過stuName進行查詢,不過findByPrimaryKey()方法是必須定義的。

  CMP student的本地Home介面參見StudentHome.java。

四、測試Entity Bean

4.1單擊Enterprise子頁,選擇EJB Test Client然後單擊OK

4.2透過“EJB Test Client Wizard”建立測試用的客戶端程式。採用預設設定即可。

4.3 將private Context getInitialContext()方法中的

  String url = "t3://hostname:7001";

  替換為:

  String url = "t3://localhost:7001";

4.4 在public static void main(String[] args)方法中新增以下程式碼,完成查詢stuid為1的Student Entity Bean,然後輸出相應的stuid,stuName和Lockerid:

  {

  StudentTestClient1 client = new StudentTestClient1();

    client.findByPrimaryKey(new BigDecimal(1));

  System.out.println("stuid = " + client.getStuid());

    System.out.println("Stuname = " + client.getStuname());

  System.out.println("Lockerid = " + client.getLockerid());

4.5 執行檢視結果。

4.6 用以下語句替換public static void main(String[] args)方法中剛才新增的程式碼,完成新建一個Student Bean的操作。

  public static void main(String[] args)

  {

  StudentTestClient1 client = new StudentTestClient1();

    client.create(new BigDecimal(4));

  client.setStuname("student4");

    client.setLockerid(new BigDecimal(4));

  }

4.7 執行檢視結果。

附錄

電子工業出版社  《J2EE應用開發(Jbuilder+Weblogic)》

我的文章首發牛耳論壇()和程式設計師論壇(/" target=_blank>),歡迎轉載,不過,請保留作者以及修訂者的名字,謝謝。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963501/,如需轉載,請註明出處,否則將追究法律責任。

相關文章