Container-managed persistence (CMP) fields are virtual fields whose values map directly to the database. Persistence fields can be Java serializable types and Java primitive types.
Java serializable types can be any class that implements the
java.io.Serializable
interface. Most deployment tools handle
java.lang.String
,
java.util.Date
, and the primitive wrappers
(Byte
, Boolean
,
Short
, Integer
,
Long
, Double
, and
Float
) easily, because these types of objects are
part of the Java core and map naturally to fields in relational and
other databases.
The CustomerEJB
declares three serializable
fields, id
, lastName
, and
firstName
, which map naturally to the
INT
and CHAR
fields of the
CUSTOMER
table in the database.
You can also define your own serializable types, called dependent value classes , and declare them as CMP fields. However, I recommend that you do not use custom serializable objects as persistence field types unless it is absolutely necessary—they are usually recommended for unstructured types, such as multimedia data (images, blobs, etc.). Arbitrary dependent value classes usually will not map naturally to database types, so they must be stored in their serializable forms in some type of binary database field.
Serializable objects are always returned as copies and not
references, so modifying a serializable object will not impact its
database value. The entire value must be updated using the abstract
set<field-name>
method.
The primitive types (byte
,
short
, int
,
long
, double
,
float
, and boolean
) are also
allowed to be CMP fields.
These types are easily mapped to the database and are supported by
all deployment tools. As an example, the
CustomerEJB
might declare a
boolean
that represents a customer’s credit
worthiness:
public abstract class CustomerBean implements javax.ejb.EntityBean { public Integer ejbCreate(Integer id){ setId(id); return null; } // abstract accessor methods public abstract boolean getHasGoodCredit(); public abstract void setHasGoodCredit(boolean creditRating);