Building CMP Entity Beans

When creating standard CMP entity beans, the standard ejb-jar.xml descriptor file is used to define the persistent fields for the CMP entity bean, its primary key class, and the nature of its relationships with other entity beans. The weblogic-ejb-jar.xml descriptor file hosts the WebLogic counterpart to this information. In addition, you need to create a weblogic-cmp-rdbms-jar.xml descriptor file that maps these "virtual fields" to actual table columns in the underlying database. The weblogic-cmp-rdbms-jar.xml file allows you to configure all aspects of WebLogic's RDBMS-based persistence services for CMP entity beans. It lets you specify the database columns associated with the persistent fields, the primary key columns that identify the EJB instances, and the foreign key columns that implement the EJB relationships.

Due to the sheer number of descriptor files and source files that need to be maintained, the easiest approach to developing entity beans is to use EJBGen, or IDEs such as WebLogic Workshop. The following sections show a working example of this approach, together with an outline of the descriptor files. If you don't want to use EJBGen, then you have to create, by hand, the same set of descriptor files described in the following sections.

11.1.1 A Simple EJB

Example 11-1 shows the complete code for a simple CMP entity bean. It uses WebLogic's GenericEntityBean class to simplify the development.

Example 11-1. The Department EJB abstract class

import javax.ejb.*; import weblogic.ejb.*; /** * @ejbgen:entity prim-key- * ejb-name = "DepartmentEJB" * data-source-name = "MyDataSource" * table-name = "tblDepartment" * abstract-schema-name = DepartmentSchema * @ejbgen:jndi-name * local = "ejb.DepartmentEJBLocalHome" * @ejbgen:finder ejb-ql="SELECT OBJECT(o) from DepartmentSchema as o" * generate-on="Local" signature="Collection findAll( )" */ abstract public class DepartmentEJB extends GenericEntityBean implements EntityBean { /** * @ejbgen:cmp-field primkey-field="true" column="Id" * @ejbgen:local-method */ public abstract Integer getId( ); /** * @ejbgen:local-method */ public abstract void setId(Integer arg); /** * @ejbgen:cmp-field column="Name" * @ejbgen:local-method */ public abstract String getName( ); /** * @ejbgen:local-method */ public abstract void setName(String arg); public java.lang.Integer ejbCreate(java.lang.Integer Id) { setId(Id); return null; } public void ejbPostCreate(java.lang.Integer Id) {} }

The EJBGen tags capture a lot of additional metadata and deployment information about the Department EJB:

11.1.2 Associated Java Files

EJBGen now can generate a number of Java files using this code. For example, it can generate the EJB's local home and local interface files. Example 11-2 shows the local home interface generated for the Department EJB.

Example 11-2. Home interface for the Department EJB

public interface DepartmentLocalHome extends EJBLocalHome { public Collection findAll( ) throws FinderException; public DepartmentLocal findByPrimaryKey(Integer primaryKey) throws FinderException; public DepartmentLocal create(Integer Id) throws CreateException; }

Note how EJBGen is able to insert the findAll( ) method automatically, due to the presence of the ejbgen:finder tag in the Department EJB abstract class. More interestingly, EJBGen also will generate a transfer object. Example 11-3 shows the transfer object that is generated for the Department EJB.

Example 11-3. Transfer object for the Department EJB

public class DepartmentValue implements Serializable { public DepartmentValue( ) {} public DepartmentValue(java.lang.Integer id, java.lang.String name) { m_id = id; m_name = name; } private java.lang.Integer m_id; private java.lang.String m_name; public java.lang.Integer getId( ){ return m_id; } public void setId(java.lang.Integer n){ m_id = n; } public java.lang.String getName( ){return m_name;} public void setName(java.lang.String n){m_name = n;} public boolean equals(Object other) { /* ... */ } public int hashCode( ) { /* ... */ } }

11.1.3 EJB Deployment Descriptor

EJBGen also generates the deployment descriptors needed to deploy the Department EJB successfully: ejb-jar.xml, weblogic-ejb-jar.xml, and weblogic-cmp-rdbms-jar.xml. ejb-jar.xml is the standard entity descriptor file, and we won't consider it any further. Example 11-4 shows the WebLogic-specific weblogic-ejb-jar.xml descriptor file that is generated for the Department EJB.

Example 11-4. The weblogic-ejb-jar.xml descriptor for the Department EJB

DepartmentEJB WebLogic_CMP_RDBMS 8.1 META-INF/weblogic-cmp-rdbms-jar.xml ejb.DepartmentEJBLocalHome

This file also can host other bean configuration properties, such as the cache and pool settings. The persistence-use tag in the weblogic-ejb-jar.xml file lets you specify an identifier for the type of persistence that is used by the entity EJB. It also lets you specify the location of the file that provides additional information about the abstract persistence model. Example 11-5 shows how the referenced weblogic-cmp-rdbms-jar.xml descriptor maps the EJB's persistent fields defined in the ejb-jar.xml file to the actual database columns.

Example 11-5. Configuring RDBMS-based EJB persistence

DepartmentEJB MyDataSource tblDepartment id Id name Name

Let's take a closer look at the information captured in this deployment descriptor:

11.1.4 Creating the EJB JAR

Now you are ready to build the EJB JAR using a staging folder or JAR file. The content will include the compiled Java classes and the deployment descriptors:

/com/oreilly/ejbs/DepartmentLocalHome.class /com/oreilly/ejbs/DepartmentLocal.class /com/oreilly/ejbs/DepartmentEJB.class /com/oreilly/ejbs/DepartmentValue.class /META-INF/ejb-jar.xml /META-INF/weblogic-ejb-jar.xml /META-INF/weblogic-cmp-rdbms-jar.xml

In order to create the EJB JAR, use the appc compiler:

java weblogic.appc -output ejb_foo.jar staging-dir

In WebLogic 7.0, you need to use the ejbc compiler:

java weblogic.ejbc staging-dir ejb_foo.jar

Категории