当前页面: 开发资料首页 → Netbeans 专题 → 使用 CMP Beans 生成主键值
摘要: 使用 CMP Beans 生成主键值 反馈 Sun Java System Application Server 支持 EJB 1.1、2.0 和 2.1 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。
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));
从数据库连接生成 CMP beans 时,IDE 将自动把 id 列注册为主键,并为其创建 CMP 字段和 finder 方法。这要求您在能够运行 ejbCreate 方法前已了解主键。
而从应用程序服务器获得主键,您需要编辑 CMP bean,并对部署描述符和 ejbCreate 方法进行适当更改。
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 }已执行以下操作:
... public org.bank.CustomerLocal create(java.lang.String lastName, java.lang.String firstName) throws javax.ejb.CreateException; ...
... org.bank.CustomerLocal findByPrimaryKey(java.lang.Object key) throws javax.ejb.FinderException; ...
现在需要创建一个访问 CMP bean 的正面会话 bean。
... private javax.ejb.SessionContext context; private CustomerLocalHome customerHome; ... public void ejbCreate() { customerHome = lookupCustomerBean(); } ...
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; }
从数据库创建 CMP beans 时,IDE 将自动为数据库连接创建连接池和数据源。NetBeans 4.1 中的一个已知错误是,IDE 使用错误的 datasource 类名称为 MySQL 数据库生成连接池。您必须自己更改类名称。
现在已设置 EJB Module,并准备使用。通过填充数据库并编写快速 JUnit 测试用例来测试两个业务方法。
... public class CustomerFacadeBeanTest extends TestCase { private CustomerFacadeRemote customerFacade; ...注意:如果 Source Editor 提示无法找到 CustomerFacadeRemote,则在 Projects 窗口中右键单击项目节点并选择 Build Project 来构建项目。会出现错误。
... protected void setUp() throws Exception { InitialContext ctx = new InitialContext(); Object obj = ctx.lookup("ejb/CustomerFacadeBean"); customerFacade = ((CustomerFacadeRemoteHome)PortableRemoteObject.narrow(obj, CustomerFacadeRemoteHome.class)).create(); } ...
... 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()); } ...
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)