Identify the interfaces and methods a CMP entity bean must and must not implement.
The following are the requirements for an entity bean class:
The class MUST implement, directly or indirectly,
the javax.ejb.EntityBean interface.
public interface EntityBean extends EnterpriseBean {
void ejbActivate() throws EJBException, RemoteException;
void ejbLoad() throws EJBException, RemoteException;
void ejbPassivate() throws EJBException, RemoteException;
void ejbRemove() throws RemoveException, EJBException, RemoteException;
void ejbStore() throws EJBException, RemoteException;
void setEntityContext(EntityContext ctx) throws EJBException, RemoteException;
void unsetEntityContext() throws EJBException, RemoteException;
}
public interface EnterpriseBean extends Serializable {
}
The class MUST be defined as public and MUST be
abstract.
The class MUST define a public constructor that takes no arguments.
The class MUST NOT define the finalize() method.
The entity bean class MUST implement the BUSINESS methods, and the
ejbCreate<METHOD> and
ejbPostCreate<METHOD> methods.
The entity bean class MUST implement the
ejbHome<METHOD> methods that correspond to the home
business methods specified in the bean’s home interface. These methods are
executed on an instance in the POOLED state; hence they MUST NOT access state
that is particular to a specific bean instance (e.g., the accessor methods for the
bean’s abstract persistence schema MUST NOT be used by these methods).
The entity bean class MUST implement the get and set accessor methods of the
bean’s abstract persistence schema as abstract methods.
The entity bean class may have superclasses and/or superinterfaces. If the entity
bean has superclasses, the business methods, the
ejbCreate<METHOD> and
ejbPostCreate<METHOD> methods, and the methods of the
EntityBean interface may be implemented in the enterprise bean class or in
any of its superclasses.
The entity bean class is allowed to implement other methods (for example helper
methods invoked internally by the business methods) in addition to the methods
required by the EJB specification.
The entity bean class DOES NOT implement the finder methods. The
implementations of the finder methods are provided by the container.
The entity bean class MUST implement any
ejbSelect<METHOD> methods as
abstract methods.
The following are the requirements for a dependent value class:
The entity bean class MUST implement the ejbCreate<METHOD>(...)
methods that correspond to the create<METHOD>(...) methods
specified in the entity bean’s home interface.
The entity bean class may define ZERO or more
ejbCreate<METHOD>(...) methods whose signatures
must follow these rules:
The method name MUST have ejbCreate as its prefix.
The method MUST be declared as public.
The method MUST NOT be declared as final
or static.
The return type must be the entity bean’s PRIMARY KEY type
(NOTE, the return type of HOME's create(...)
method is COMPONENT INTERFACE type).
If the ejbCreate<METHOD>(...) method corresponds to
a create<METHOD>(...) on the entity bean’s remote
home interface, the method arguments and return value types must be
legal types for RMI-IIOP.
The throws clause MUST define
the javax.ejb.CreateException.
The throws clause may define arbitrary application
specific exceptions.
For each ejbCreate<METHOD>(...) method, the entity bean class
MUST define a matching ejbPostCreate<METHOD>(...) method, using
the following rules:
The method name MUST have ejbPostCreate as its prefix.
The method MUST be declared as public.
The method MUST NOT be declared as final
or static.
The return type MUST be void.
The method arguments MUST be the same as the arguments of the matching
ejbCreate<METHOD>(...)method.
The throws clause may define arbitrary application
specific exceptions
(the javax.ejb.CreateException MAY be thrown, but
it is NOT a MANDATORY).
The entity bean class may define ZERO or more HOME methods whose
signatures must follow the following rules:
An ejbHome<METHOD>(...) method MUST exist for EVERY
home <METHOD>(...) method on the entity bean’s remote
home or local home interface. The method name MUST have ejbHome
as its prefix followed by the name of
the <METHOD> method in which the first character has
been uppercased.
The method MUST be declared as public.
The method MUST NOT be declared as static.
If the ejbHome<METHOD>(...) method corresponds to
a home <METHOD>(...) on the entity bean’s REMOTE
home interface, the method argument and return value types MUST be legal types for
RMI-IIOP.
The throws clause may define arbitrary application
specific exceptions.
The throws clause MUST NOT throw the
java.rmi.RemoteException.
The entity bean class may define one or more SELECT methods whose
signatures must follow the following rules:
The method name MUST have ejbSelect as its prefix.
The method MUST be declared as public.
The method MUST be declared as abstract.
The throws clause MUST define
the javax.ejb.FinderException.
The throws clause may define arbitrary application
specific exceptions.
The entity bean class may define ZERO or more BUSINESS methods whose signatures must
follow these rules:
The method names can be arbitrary, but they must not start with
'ejb' to avoid conflicts with the callback methods used by the EJB architecture.
The method MUST be declared as public.
The method MUST NOT be declared as final
or static.
If the business method corresponds to
a method of the entity bean’s REMOTE
interface, the method argument and return value types MUST be legal types for
RMI-IIOP.
The throws clause may define arbitrary application
specific exceptions.
The business methods of an entity bean with cmp-version
2.x MUST NOT throw the java.rmi.RemoteException.
public abstract class AddressBean implements javax.ejb.EntityBean {
...
public Integer ejbCreateAddress(String street, String city,
String state, String zip) throws CreateException {
setId(..);
setStreet(..);
setCity(..);
...
return null; // for CMP 2.x !!!
}
public void ejbPostCreateAddress(String street, String city,
String state, String zip) {
}
// persistent fields
public abstract Integer getId();
public abstract void setId(Integer id);
public abstract String getStreet();
public abstract void setStreet(String street);
public abstract String getCity();
public abstract void setCity(String city);
// ejbSelect methods
public abstract Collection ejbSelectZipCodes(String state)
throws FinderException;
public abstract Collection ejbSelectAll()
throws FinderException;
public abstract CustomerLocal ejbSelectCustomer(AddressLocal addr)
throws FinderException;
// customer home methods. These are wrappers of ejbSelect methods
public Collection ejbHomeQueryZipCodes(String state)
throws FinderException {
return ejbSelectZipCodes(state);
}
public Collection ejbHomeQueryAll()
throws FinderException {
return ejbSelectAll();
}
public CustomerLocal ejbHomeQueryCustomer(AddressLocal addr)
throws FinderException {
return ejbSelectCustomer(addr);
}
// standard call back methods
public void setEntityContext(EntityContext ec){}
public void unsetEntityContext(){}
public void ejbLoad(){}
public void ejbStore(){}
public void ejbActivate(){}
public void ejbPassivate(){}
public void ejbRemove(){}
}
<entity>
<ejb-name>AddressEJB</ejb-name>
...
<prim-key-class>java.lang.Integer</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Address</abstract-schema-name>
<cmp-field><field-name>id</field-name></cmp-field>
<cmp-field><field-name>street</field-name></cmp-field>
...
<primkey-field>id</primkey-field>
<security-identity><use-caller-identity/></security-identity>
<query>
<query-method>
<method-name>ejbSelectZipCodes</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql>
SELECT a.zip FROM Address AS a
WHERE a.state = ?1
</ejb-ql>
</query>
<query>
<query-method>
<method-name>ejbSelectAll</method-name>
<method-params/>
</query-method>
<ejb-ql>
SELECT OBJECT(a) FROM Address AS a
</ejb-ql>
</query>
...
</entity>