- Advantages of CMP Entity Beans over BMP Entity Beans
- CMP 2.0 Entity Bean Sample Application
- Step 1: Implementing the CMP 2.0 Address Entity Bean
- Step 2: Implementing the CMP 2.0 Roster Entity Bean
- Step 3: Implementing the CMP 2.0 Student Entity Bean
- Step 4: Implementing JSP Clients to Test CMP 2.0 Entity Beans
- Step 5: Packaging the CMP 2.0 Entity Beans as an ejb-jar File
- Step 6: Packaging the JSP As a Web Component
- Step 7: Deploying the CMP 2.0 Entity Bean Sample Application
- Step 8: Testing the Sample Application
- A Discussion of the Deployment Descriptor
- Summary
Step 2: Implementing the CMP 2.0 Roster Entity Bean
The Roster entity bean, RosterEJB, creates a roster of students. It has a local home interface (LocalRosterHome) and a local component interface (LocalRoster).
Implementing the Local Home Interface: LocalRosterHome.com
LocalRosterHome declares the create(), findByPrimaryKey(), and additional finder methods. The findByScheduleID() method returns a collection based on the schedule ID; the findByStudentID() method returns a collection based on the student ID argument.
public interface LocalRosterHome extends EJBLocalHome { public LocalRoster create(String rosterID, String scheduleID, String studentID)
throws CreateException; public LocalRoster findByPrimaryKey(String rosterID) throws FinderException; public Collection findByScheduleID(String scheduleID) throws FinderException; public Collection findByStudentID(String studentID) throws FinderException; }
Implementing the Local Component Interface: LocalRoster.java
The LocalRoster component declares three plain getter business methods that return persistent fields as shown next.
public interface LocalRoster extends EJBLocalObject { public String fetchRosterID(); public String fetchStudentID(); public String fetchScheduleID(); }
Implementing the CMP 2.0 Entity Bean Class: RosterEJB.com
The code snippet that follows illustrates an abstract Roster entity bean class with several abstract accessor methods for CMP fields. Note that the business method, fetchRosterID(), depends on the abstract method getRosterID() to retrieve the CMP fields from the underlying database.
public abstract class RosterEJB implements EntityBean { //accessor methods for cmp fields public abstract String getRosterID(); public abstract void setRosterID(String rosterID); public abstract String getScheduleID(); public abstract void setScheduleID(String scheduleID); public abstract String getStudentID(); public abstract void setStudentID(String studentID); //business methods public String fetchRosterID () { return getRosterID(); } public String fetchStudentID() { return getStudentID(); } public String fetchScheduleID() { return getScheduleID(); }
The ejbCreate() method is shown next. It calls no data access calls but rather uses the setter methods to set the persistent fields.
public String ejbCreate (String rosterID, String scheduleID, String studentID) throws CreateException { System.out.println("RsoterEJB.ejbCreate..."); setRosterID(rosterID); setScheduleID(scheduleID); setStudentID(studentID); return null; }
The ejbPostCreate() method performs the JNDI lookup for the Student bean reference. It then uses the component interface to add the instance to the student instance object so it can be accessed by the student bean instance.
public void ejbPostCreate (String rosterID, String scheduleID, String studentID)
throws CreateException { System.out.println("RosterEJB ejbPostCreate...rosterID = "+rosterID); try { Context ic = new InitialContext(); LocalStudentHome home = (LocalStudentHome) ic.lookup("java:comp/env/ejb/StudentRef"); LocalStudent student = home.findByPrimaryKey(sid); student.addRoster((LocalRoster)context.getEJBLocalObject()); } catch (Exception ex) { context.setRollbackOnly(); ex.printStackTrace(); } }
Compiling LocalRosterHome.java, LocalRoster.java, and RosterEJB.java
If you are not already in the APPHOME\chapter11\cmp directory, change to this directory and run the compileRoster.bat batch file to compile the Roster bean class. The batch file generates LocalRosterHome.class, LocalRoster.class, and RosterEJB.class.