首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

使用 CMP Bean 實現主鍵自動生成策略

     編輯:Java 相關知識

前言

Sun Java System Application Server 支援 EJB 1.1、2.0、2.1 版 CMP Bean 的自動主鍵生成。本文說明如何配置與實作。

自動主鍵生成配置

在 ejb-jar.xml 中將 prim-key-class 設為 java.lang.Object 即可啟用自動主鍵。擁有自動主鍵的 CMP Bean 可參與與其他 CMP Bean 的關聯。注意:不支援資料庫自動生成的主鍵值(如 identity、sequence)。

部署時期資料庫結構處理

  • 部署時建立結構:伺服器自動建立含主鍵欄的結構描述,執行時為主鍵欄生成唯一值。
  • 部署時不建立結構:對應資料表的主鍵欄必須為 NUMERIC(19) 或更高精度,且不對應任何 CMP 欄位。執行時由伺服器生成唯一值。

前置準備

  • 安裝 Sun Java System Application Server Platform Edition 8.1
  • 在 IDE 註冊伺服器 (工具 > 伺服器管理器)
  • 可選用 MySQL 取代 PointBase 做為資料庫

建立範例資料表

CREATE TABLE customer (
    id BIGINT(19) NOT NULL auto_increment, -- 由資料庫自動生成
    lastName varchar(25) NOT NULL,
    firstName varchar(30) default NULL,
    PRIMARY KEY (id)
);

建立 EJB 模組與 CMP Bean

  1. 新建 EJB 模組專案 CustomerModule
  2. 右鍵專案選 新增 > 從資料庫建立 CMP Bean,選擇 MySQL 連線、套件 org.bank、資料表 customer
  3. IDE 會自動將 id 識別為主鍵並建立 CMP 欄位與 finder 方法

修改 CMP Bean 以使用伺服器生成主鍵

  1. 刪除 id CMP 欄位(專案視窗 企業 Bean > CustomerEB > CMP 欄位,右鍵刪除)
  2. 修改 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("欄位 \"lastName\" 不可為 null");
    }
    setLastName(lastName);
    setFirstName(firstName);
    return null; // 由容器生成主鍵
}

public void ejbPostCreate(java.lang.String lastName, java.lang.String firstName) {
    // 關聯關係初始化
}

變更重點:移除 id 參數、回傳型別改為 java.lang.Object、移除設定 id 的程式碼。

  1. 修改 CustomerLocalHome 介面:create 方法移除 id 參數;findByPrimaryKey 參數型別改為 java.lang.Object
  2. 編輯 ejb-jar.xml:General 分頁將 Primary key class 改為 java.lang.Object;XML 原始碼視圖刪除 primkey-field 元素
  3. 儲存所有檔案

建立 Session Facade

  1. 新增無狀態 Session Bean CustomerFacade,僅含遠端介面
  2. 注入 CustomerLocalHome:右鍵類別選 企業資源 > 呼叫企業 Bean 選擇 CustomerEB
  3. 宣告 private CustomerLocalHome customerHome,在 ejbCreate 中初始化
  4. 新增業務方法:
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;
}
  1. 右鍵方法選 EJB 方法 > 加入遠端介面

設定 MySQL DataSource 類別名稱

NetBeans 4.1 已知問題:建立連線池時 MySQL 的 DataSource 類別名稱錯誤。需手動修正:

  1. 展開 伺服器資源,雙擊 connection-pool-mysql.sun-resource
  2. 將 DataSource Classname 改為 com.mysql.jdbc.jdbc2.optional.MysqlDataSource

測試 EJB 模組 (JUnit)

  1. 對 CustomerFacadeBean 產生 JUnit 測試 (工具 > JUnit 測試 > 建立測試)
  2. 宣告 private CustomerFacadeRemote customerFacade
  3. 修改 setUp() 取得遠端介面:
protected void setUp() throws Exception {
    InitialContext ctx = new InitialContext();
    Object obj = ctx.lookup("ejb/CustomerFacadeBean");
    customerFacade = ((CustomerFacadeRemoteHome) 
        PortableRemoteObject.narrow(obj, CustomerFacadeRemoteHome.class)).create();
}
  1. 修改測試方法:
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());
}
  1. 測試類路徑加入 appserv-rt.jar (伺服器 lib 目錄)
  2. 部署專案並執行測試

測試輸出範例

PK: 1123065661713
Testsuite: org.bank.CustomerFacadeBeanTest
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 3.855 sec
BUILD SUCCESSFUL (total time: 6 seconds)

主鍵值 1123065661713 為伺服器自動生成的唯一值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved