程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用CMP Beans生成主鍵值

使用CMP Beans生成主鍵值

編輯:關於JAVA

Sun Java System Application Server 支持 EJB 1.1、2.0 和 2.1 CMP beans 的自動主鍵生成。若 要指定自動主鍵生成,在 ejb-jar-xml 文件中將 prim-key-class 元素的值規定為 java.lang.Object。 具有自動生成主鍵的 CMP beans 可以參與與其他 CMP beans 的關系。Sun Java System Application Server 不支持數據庫生成的主鍵值。

如果在部署期間創建數據庫架構,Sun Java System Application Server 將創建具有主鍵列的方案, 然後在運行時為主鍵列生成唯一的值。

如果在部署期間未創建數據庫架構,則映射表中的主鍵列必須是 NUMERIC 類型,精度為 19 或更高, 且不要映射到任何 CMP 字段。Sun Java System Application Server 將在運行時為主鍵列生成唯一的值 。

入門

開始之前,必須在計算機上安裝 Sun Java System Application Server Platform Edition 8.1(下 載)。您無法將企業應用程序部署到綁定的 Tomcat 服務器。還必須在 IDE 中注冊應用程序服務器,通 過選擇 Tools > Server Manager。

本例也可以使用 MySQL 替換 PointBase 作為數據庫服務器。若要了解如何在 NetBeans 中和應用程 序服務器上設置 MySQL,請參見此文檔。

創建數據庫表

我們所使用的范例是一個非常簡單的數據庫表,列出用戶的 ID、last name 和 first name。

在 IDE 中注冊 MySQL 驅動程序。在 Runtime 窗口中,展開 Databases > Drivers,右鍵單擊 Drivers 節點並選擇 Add Driver。

將連接注冊到任一現有 MySQL 數據庫。在 Runtime 窗口中,右鍵單擊 MySQL driver 的節點並選擇 Connect Using。(有關在 NetBeans IDE 中注冊 MySQL 的更多信息,請參見此文檔。)

在數據庫中創建示例表。右鍵單擊數據庫連接的節點並選擇 Execute Command。在 Command 字段中, 鍵入以下命令,然後單擊 Execute:

CREATE TABLE customer (
    id BIGINT(19) NOT NULL auto_increment, -- this column will be automat. generated
    lastName varchar(25) NOT NULL,
    firstName varchar(30) default NULL,
    PRIMARY KEY (id));

創建 EJB 模塊

從數據庫連接生成 CMP beans 時,IDE 將自動把 id 列注冊為主鍵,並為其創建 CMP 字段和 finder 方法。這要求您在能夠運行 ejbCreate 方法前已了解主鍵。

而從應用程序服務器獲得主鍵,您需要編輯 CMP bean,並對部署描述符和 ejbCreate 方法進行適當 更改。

編寫 CMP Bean 的代碼

從主菜單選擇 File > New Project (Ctrl-Shift-N),然後創建名為 CustomerModule 的新 EJB Module 項目。

右鍵單擊 CustomerModule 項目並選擇 New > CMP Beans from Database。選擇 MySQL 數據庫連 接,然後將 org.bank 指定為包。在向導的下一頁中,從數據庫選擇 customer 表,然後單擊 Finish。

IDE 將為 customer 表創建 CMP bean。

刪除 id CMP 字段。在 Projects 窗口中,展開 Enterprise Beans > CustomerEB > CMP Fields,右鍵單擊 id 節點並選擇 Delete。

將 CustomerBean 中的 ejbCreate 和 ejbPostCreate 方法更改如下:

public java.lang.Object ejbCreate(java.lang.String lastName, java.lang.String firstName)
   throws javax.ejb.CreateException {
  if (lastName == null) {
   throw new javax.ejb.CreateException("The field \"lastName\" must not be null");
  }
  // TODO add additional validation code, throw CreateException if data is not valid
  setLastName(lastName);
  setFirstName(firstName);
  return null;
  }
public void ejbPostCreate(java.lang.String lastName, java.lang.String firstName) {
  // TODO populate relationships here if appropriate
}

已執行以下操作:

從兩個方法的參數中移除 id。

將 ejbCreate 的返回類型更改為 java.lang.Object。

移除了 ejbCreate 中檢查 id 是否為空的 if 子句。

移除了為該 bean 設置 id 字段的代碼。

轉到 CustomerLocalHome 接口,然後從 create 方法的參數中移除 id。

...
public org.bank.CustomerLocal create(java.lang.String lastName, java.lang.String firstName)
   throws javax.ejb.CreateException;
...

在 CustomerLocalHome 中,將 findByPrimaryKey 方法的參數類型由 java.lang.Long 更改為 java.lang.Object:

...
org.bank.CustomerLocal findByPrimaryKey(java.lang.Object key)
   throws javax.ejb.FinderException;
...

雙擊 ejb-jar.xml,在 Source Editor 中將其打開。在 General 部分,將 Primary key class 更改 為 java.lang.Object。

單擊 ejb-jar.xml 編輯器頂部的 XML,查看部署描述符的 XML 源代碼。轉到 primkey-field 元素, 然後刪除它。

選擇 File > Save All。

創建會話 Bean

現在需要創建一個訪問 CMP bean 的正面會話 bean。

右鍵單擊 CustomerModule 項目並選擇 New > Session Bean。將該 bean 命名為 CustomerFacade ,並將其放在 org.bank 包中,然後設置為 Stateless 且僅有遠程接口。

在 CustomerFacadeBean 類中,右鍵單擊並選擇 Enterprise Resources > Call Enterprise Bean 。選擇 CustomerEB,然後單擊 OK。IDE 將插入 lookupCustomerBean 方法。

聲明一個 private CustomerLocalHome customerHome 對象,然後更改 ejbCreate 方法以調用 lookupCustomerBean 方法:

...
private javax.ejb.SessionContext context;
private CustomerLocalHome customerHome;
...
public void ejbCreate() {
  customerHome = lookupCustomerBean();
}
...

將以下業務方法添加到 CustomerFacadeBean:

public void createCustomer(String lastName, String firstName) throws Exception {
  customerHome.create(lastName, firstName);
}
public Collection getLastName(String firstName) throws Exception {
  ArrayList names = new ArrayList();
  Iterator it = customerHome.findByLastName(firstName).iterator();
   while(it.hasNext()){
    names.add(((CustomerLocal)it.next()).getLastName());
   }
  return names;
}

在 Source Editor 中,右鍵單擊每一個剛添加的方法的名稱,然後選擇 EJB Methods > Add to Remote Interface。

選擇 File > Save All。

設置 Datasource 類名稱

從數據庫創建 CMP beans 時,IDE 將自動為數據庫連接創建連接池和數據源。NetBeans 4.1 中的一 個已知錯誤是,IDE 使用錯誤的 datasource 類名稱為 MySQL 數據庫生成連接池。您必須自己更改類名 稱。

展開 Server Resources,然後雙擊 connection-pool-mysql.sun-resource 節點。

將 DataSource Classname 屬性值更改為 com.mysql.jdbc.jdbc2.optional.MysqlDataSource。

關閉屬性表。

測試 EJB 模塊

現在已設置 EJB Module,並准備使用。通過填充數據庫並編寫快速 JUnit 測試用例來測試兩個業務 方法。

編寫 JUnit Test 代碼

在 Projects 窗口或 Source Editor 中選擇 CustomerFacadeBean,然後選擇 Tools > JUnit Tests > Create Tests (Ctrl-Alt-J)。接受對話框中的默認選項,然後單擊 OK。IDE 將創建 CustomerFacadeBeanTest,並在 Source Editor 中打開它。

聲明 private CustomerFacadeRemote customerFacade 對象:

...
public class CustomerFacadeBeanTest extends TestCase {
  private CustomerFacadeRemote customerFacade;
...

注意:如果 Source Editor 提示無法找到 CustomerFacadeRemote,則在 Projects 窗口中右鍵單擊項目節點並選擇 Build Project 來構建項目。會出現錯誤。

將 setUp 方法更改如下:

...
protected void setUp() throws Exception {
  InitialContext ctx = new InitialContext();
  Object obj = ctx.lookup("ejb/CustomerFacadeBean");
  customerFacade = ((CustomerFacadeRemoteHome)PortableRemoteObject.narrow(obj,
    CustomerFacadeRemoteHome.class)).create();
}
...

將 testCreateCustomer 和 testGetCustomerName 方法更改如下:

...
public void testCreateCustomer() throws Exception {
  System.out.println("PK:" + customerFacade.createCustomer("Foo","Bar"));
}
public void testGetCustomerName() throws Exception {
  long id = customerFacade.createCustomer("Joe", "User");
  assertEquals(1, getLastName("name").length());
}
...

刪除 testMethodName 方法的其余部分。

在 Projects 窗口中右鍵單擊 Test Libraries 節點,並選擇 Add JAR/Folder。將應用程序的 lib 目錄中的 appserv-rt.jar 文件添加到測試類路徑中。

按下 Alt-Shift-F 生成任何所需的 import 語句。

右鍵單擊 CustomerModule 項目節點,然後選擇 Deploy Project。IDE 將部署該項目。

在 Projects 窗口中選中 CustomerModule 項目,然後選擇 Run > Test "CustomerModule"。IDE 將編譯並運行測試,然後在 Output 窗口中顯示以下輸出。

init:
deps-jar:
compile:
Compiling 1 source file to C:\new\CustomerModule\build\test\classes
compile-test:
03-Aug-2005 12:42:11 com.sun.corba.ee.spi.logging.LogWrapperBase doLog
INFO: "IOP00710299: (INTERNAL) Successfully created IIOP listener on the specified host/port: all
interfaces/1502"
PK: 1123065661713
Testsuite: org.bank.CustomerFacadeBeanTest
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 3.855 sec
------------- Standard Output ---------------
PK: 1123065661713
------------- ---------------- ---------------
------------- Standard Error -----------------
03-Aug-2005 12:42:11 com.sun.corba.ee.spi.logging.LogWrapperBase doLog
INFO: "IOP00710299: (INTERNAL) Successfully created IIOP listener on the specified host/port:
all interfaces/1502"
------------- ---------------- ---------------
test-report:
test:
BUILD SUCCESSFUL (total time: 6 seconds)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved