In this example, the Teacher CMP bean is related to the Course CMP bean. At Hogwarts, teaching a course is so demanding that every teacher can teach only one Course. Therefore this is a one-to-one relation.
We can have Resin-CMP manage this relationship for us so that we don't have
to use JDBC to find related entities.
Our two beans in this example will use the following 2 tables:
# this table stores the teacher entities
CREATE TABLE one2one_teacher (
name VARCHAR(250) NOT NULL,
course VARCHAR(250) NOT NULL,
PRIMARY KEY(name)
);
# this table stores the course entities
CREATE TABLE one2one_course(
name VARCHAR(250) NOT NULL,
room VARCHAR(250) NOT NULL,
teacher VARCHAR(250) NOT NULL,
PRIMARY KEY(name)
);
Resin-CMP can find the course associated with a teacher by looking for
a 'name' in the one2one_course table that matches the 'course' in a
Teacher entity.
Conversely, Resin-CMP can find the teacher associated with a a course by
looking for a 'name' in the one2one_teacher table that matches the 'teacher'
in the Course entity.
Setting up the deployment descriptor
All setup related to CMR is done in the <relationships> section. We set up our one2one relationship like this:
 <relationships>
  <ejb-relation>
   <ejb-relationship-role>
    <relationship-role-source>
      <ejb-name>one2one_teacher</ejb-name>
    </relationship-role-source>
    <cmr-field>
     <cmr-field-name>course</cmr-field>
    <multiplicity>One</multiplicity>
   </ejb-relationship-role>
   <ejb-relationship-role>
    <relationship-role-source>
      <ejb-name>one2one_course</ejb-name>
    </relationship-role-source>
    <cmr-field>
     <cmr-field-name>teacher</cmr-field>
    <multiplicity>One</multiplicity>
    </ejb-relationship-role>
  </ejb-relation>
 </relationships>
Every <ejb-relation> has two participating entity beans. Their role in the relation is defined within a <ejb-relationship-role> section. Use the <ejb-name> tag to describe which entity the <ejb-relationship-role> block belongs to.
Writing code for the CMR fields
For the Course Bean, we have defined teacher
as a CMR
field. We need to match this with two method declarations in CourseBean.java.
Resin-CMP will automatically implement these methods when the bean is deployed.
abstract public Teacher getTeacher();
abstract public void setTeacher(Teacher teacher); // doesn't work in 06-20 snap
We can use the setTeacher
method to assign a teacher to a Course.
If the Course is already being taught by another teacher, Resin-CMP
will disassociate the original teacher from the Course.
Similarly, for the Teacher Bean, we have defined course
as
a CMR field. We need to match this with a method declaration in TeacherBean.java:
abstract public Course getCourse();
abstract public void setCourse(Course course); // doesn't work in 06-20 snap
Here we can use the setCourse
method to assign a Course to a Teacher.
If the Teacher is currently teaching another Course, Resin-CMP
will disassociate the original Course from the teacher.