Package example.cmp.relations.one2one

Container Managed Relationships in a one-to-one (1-1) context.

See:
          Description

Interface Summary
Course Local interface for the Course bean.
CourseHome Home interface for the Course bean.
Teacher Local interface for the Teacher bean.
TeacherHome Home interface for the Teacher bean.
 

Class Summary
ClientServlet Illustrates a client that makes use of the 1-1 related CMP beans.
CourseBean Implementation class for the Course bean.
TeacherBean Implementation class for the Teacher bean.
 

Package example.cmp.relations.one2one Description

Container Managed Relationships in a one-to-one (1-1) context.

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.