站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Netbeans 专题使用 CMP Beans 生成主键值

使用 CMP Beans 生成主键值

摘要: 使用 CMP Beans 生成主键值 反馈 Sun Java System Application Server 支持 EJB 1.1、2.0 和 2.1 CMP beans 的自动主键生成。若要指定...
使用 CMP Beans 生成主键值

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。

  1. 在 IDE 中注册 MySQL 驱动程序。在 Runtime 窗口中,展开 Databases > Drivers,右键单击 Drivers 节点并选择 Add Driver。
  2. 将连接注册到任一现有 MySQL 数据库。在 Runtime 窗口中,右键单击 MySQL driver 的节点并选择 Connect Using。(有关在 NetBeans IDE 中注册 MySQL 的更多信息,请参见此文档。)
  3. 在数据库中创建示例表。右键单击数据库连接的节点并选择 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 的代码

  1. 从主菜单选择 File > New Project (Ctrl-Shift-N),然后创建名为 CustomerModule 的新 EJB Module 项目。
  2. 右键单击 CustomerModule 项目并选择 New > CMP Beans from Database。选择 MySQL 数据库连接,然后将 org.bank 指定为包。在向导的下一页中,从数据库选择 customer 表,然后单击 Finish。
    IDE 将为 customer 表创建 CMP bean。
  3. 删除 id CMP 字段。在 Projects 窗口中,展开 Enterprise Beans > CustomerEB > CMP Fields,右键单击 id 节点并选择 Delete。
  4. CustomerBean 中的 ejbCreateejbPostCreate 方法更改如下:
    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 字段的代码。
  5. 转到 CustomerLocalHome 接口,然后从 create 方法的参数中移除 id
    ...
    public org.bank.CustomerLocal create(java.lang.String lastName, java.lang.String firstName)
        throws javax.ejb.CreateException;
    ...
  6. CustomerLocalHome 中,将 findByPrimaryKey 方法的参数类型由 java.lang.Long 更改为 java.lang.Object
    ...
    org.bank.CustomerLocal findByPrimaryKey(java.lang.Object key)
        throws javax.ejb.FinderException;
    ...
  7. 双击 ejb-jar.xml,在 Source Editor 中将其打开。在 General 部分,将 Primary key class 更改为 java.lang.Object
  8. 单击 ejb-jar.xml 编辑器顶部的 XML,查看部署描述符的 XML 源代码。转到 primkey-field 元素,然后删除它。
  9. 选择 File > Save All。

创建会话 Bean

现在需要创建一个访问 CMP bean 的正面会话 bean。

  1. 右键单击 CustomerModule 项目并选择 New > Session Bean。将该 bean 命名为 CustomerFacade,并将其放在 org.bank 包中,然后设置为 Stateless 且仅有远程接口。
  2. CustomerFacadeBean 类中,右键单击并选择 Enterprise Resources > Call Enterprise Bean。选择 CustomerEB,然后单击 OK。IDE 将插入 lookupCustomerBean 方法。
  3. 声明一个 private CustomerLocalHome customerHome 对象,然后更改 ejbCreate 方法以调用 lookupCustomerBean 方法:
    ...
    private javax.ejb.SessionContext context;
    private CustomerLocalHome customerHome;
    ...
    
    public void ejbCreate() {
      customerHome = lookupCustomerBean();
    }
    ...
  4. 将以下业务方法添加到 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;
    } 
  5. 在 Source Editor 中,右键单击每一个刚添加的方法的名称,然后选择 EJB Methods > Add to Remote Interface。
  6. 选择 File > Save All。

设置 Datasource 类名称

从数据库创建 CMP beans 时,IDE 将自动为数据库连接创建连接池和数据源。NetBeans 4.1 中的一个已知错误是,IDE 使用错误的 datasource 类名称为 MySQL 数据库生成连接池。您必须自己更改类名称。

  1. 展开 Server Resources,然后双击 connection-pool-mysql.sun-resource 节点。
  2. 将 DataSource Classname 属性值更改为 com.mysql.jdbc.jdbc2.optional.MysqlDataSource
  3. 关闭属性表。

测试 EJB 模块

现在已设置 EJB Module,并准备使用。通过填充数据库并编写快速 JUnit 测试用例来测试两个业务方法。

编写 JUnit Test 代码

  1. 在 Projects 窗口或 Source Editor 中选择 CustomerFacadeBean,然后选择 Tools > JUnit Tests > Create Tests (Ctrl-Alt-J)。接受对话框中的默认选项,然后单击 OK。IDE 将创建 CustomerFacadeBeanTest,并在 Source Editor 中打开它。
  2. 声明 private CustomerFacadeRemote customerFacade 对象:
    ...
    public class CustomerFacadeBeanTest extends TestCase {
      private CustomerFacadeRemote customerFacade;
    ...
    注意:如果 Source Editor 提示无法找到 CustomerFacadeRemote,则在 Projects 窗口中右键单击项目节点并选择 Build Project 来构建项目。会出现错误。
  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();
    }
    ...
  4. testCreateCustomertestGetCustomerName 方法更改如下:
    ...
    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());
    }
    ...
  5. 删除 testMethodName 方法的其余部分。
  6. 在 Projects 窗口中右键单击 Test Libraries 节点,并选择 Add JAR/Folder。将应用程序的 lib 目录中的 appserv-rt.jar 文件添加到测试类路径中。
  7. 按下 Alt-Shift-F 生成任何所需的 import 语句。
  8. 右键单击 CustomerModule 项目节点,然后选择 Deploy Project。IDE 将部署该项目。
  9. 在 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)
    



↑返回目录
前一篇: 使用 NetBeans IDE 测试 Enterprise Beans
后一篇: NetBeans 4.1 端到端演示