分析实体Bean的应用时,会发现应用数据之间往往存在一些关系,这些数据本身对应的数据表之间存在着表项字段的关系,这些关系需要实体Bean来维护。EJB 2.0为实体Bean提供了对关系的全面支持,实现了CMR。
EJB 2.0对关系的支持给开发提供了很大方便,EJB 2.0的关系包括单项关系和双向关系,从对象数量上分为一对一、一对多和多对多3种,下面将通过实例来说明。
下面School的例子要复杂一些,由5个实体Bean组成,它们之间存在着一定的关系,具体关系如图3-13所示。


图3-13 School关系示图
表达这些实体Bean和它们之间的关系,需要在配置文件中体现,首先在jboss.xml中声明这5个实体Bean:
<?xml version="1.0"?>
TeacherBean
cmp/teacherLocal
ClassBean
cmp/classLocal
ClassroomBean
cmp/classroomLocal
StudentBean
cmp/studentLocal
GradeBean
cmp/gradeLocal
这里全部使用了本地对象。这个例子的重点不在jbosscmp-jdbc.xml,所有的新内容都在ejb-jar.xml中定义,ejb-jar.xml中声明了5个实体Bean之间存在4种关系,如下所示。
1.TeacherToClass关系
对于teacher与class的关系,一个老师通常会教多个班级,所以是一对多的关系。和从前一样,先定义这两个实体Bean:
Teacher
TeacherBean
com.liuyang.ejb.cmp.Teacher.TeacherLocalHome
com.liuyang.ejb.cmp.Teacher.TeacherLocal
com.liuyang.ejb.cmp.Teacher.TeacherBean
Container
java.lang.Integer
Container
False
2.x
TeacherBean
teacherId
teacherName
sex
birthday
teacherId
Teacher包含: teacherId, teacherName, sex, birthday四个数据项,其中teacherId是主键。
Class
ClassBean
com.liuyang.ejb.cmp.Class.ClassLocalHome
com.liuyang.ejb.cmp.Class.ClassLocal
com.liuyang.ejb.cmp.Class.ClassBean
Container
java.lang.String
Container
False
2.x
ClassBean
classId
classId
Class包含classId一个数据项,classId是主键。
在两个实体Bean之间建立关系需要定义两个实体对象,这里是teacher和Class,它们之间的关系定义用如下的方式描述:
TeacherToClass
Teacher-has-Classes
One
TeacherBean
Class-belongsto-Teacher
Many
ClassBean
teacher
一个关系有两个关系角色组成,一个是由teacher指向class的Teacher-has-Classes,另一个是由class指向teacher的Class-belongsto-Teacher,所以一个关系的定义被分成两个关系角色的定义。
One
multiplicity用来规定一个关系角色的数量,这里的数量可以是one,即1个,或者Many,即多个。
TeacherBean
relationship-role-source用来规定关系角色的EJB对象。注意,这里使用的是EJB的名字,而不是JNDI的名字。
teacher
最重要的是cmr-field, CMR(Container Manager Relationship)是CMP 2.0的新特性,CMR为程序员实现数据之间的关系提供了极大的方便,可以定义一些CMR,并在实体Bean的类中给出对应的get()和set()方法,目的是存取关系项。这些关系项不是原有实体Bean的数据项,而是由容器管理的数据项,比如下面的定义:
teacher
对应地需要在ClassBean的实现代码中加入如下代码:
public abstract TeacherLocal getTeacher();
public abstract void setTeacher(TeacherLocal teacher);
这两个方法由容器实现,但是必须在这里声明它们。同时为了能够通过接口使用这两个方法,还需在对应的object接口(ClassLocal)中添加这两个方法:
public TeacherLocal getTeacher();
public void setTeacher(TeacherLocal teacher);
这样就可以通过object接口调用CMR方法了。由此可见CMR简化了我们开发数据表之间关系的实现过程。
2.ClassToClassroom关系
与前面的关系不同,ClassToClassroom是一对一的关系,它包含一个CMR:
classroom
所以在object接口(ClassLocal)中添加两个相应的方法:
public ClassroomLocal getClassroom();
public void setClassroom(ClassroomLocal room);
在ClassBean的实现代码中加入如下内容:
public abstract ClassroomLocal getClassroom();
public abstract void setClassroom(ClassroomLocal room);
这两个关系的例子,展示了如何定义一个一对多或一对一的方法,但是只在一个关系角色中使用了CMR,这让你懂得了关系的用法,下面的这个关系示例要复杂一点。
3.ClassToStudents关系
ClassToStudents
Class-has-Students
One
ClassBean
students
java.util.Collection
Students-belongsto-Class
Many
StudentBean
myclass
ClassToStudents是一对多的关系,一个学生属于一个班,而一个班有很多学生,我们为一个班(class)对象设计了一个CMR,如下:
students
java.util.Collection
使用这个CMR可以管理一个class对应的多个student对象。这里需要为students指定一个集合类型,在前面的章节中,我们为CMP指定集合对象时提到过两种集合类Collection和Enumeration,这里我们仍然可以使用Collection,但是Enumeration不可以使用,除了Collection,你在这里还可以使用java.util.Set。
这里我使用了java.util.Collection,所以在object接口(ClassLocal)中添加两个相应的方法:
public Collection getStudents();
public void setStudents(Collection students);
在ClassBean的实现代码中加入对应方法:
public abstract Collection getStudents();
public abstract void setStudents(Collection students);
这个关系的另一端角色中包含另一个CMR:
myclass
这个CMR为一个student对象提供了访问其所在class的方法,在对应的Student- Local中加入下面两个方法:
public ClassLocal getMyclass();
public void setMyclass(ClassLocal myclass);
在StudentBean(student的实现类)中加入如下内容:
public abstract ClassLocal getMyclass();
public abstract void setMyclass(ClassLocal myclass);
4.StudentToGrade关系
这个关系是一个学生和年级之间的一对一关系,在这个例子中两个关系角色各包含一个CMR:
StudentToGrade
Student-has-Grade
One
StudentBean
grade
Grade-belongsto-Student
One
GradeBean
student
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-131577/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/374079/viewspace-131577/
本文详细解析了EJB2.0中实体Bean的CMR(Container Managed Relationships)特性,通过具体示例说明了一对一、一对多及多对多关系的实现方法,展示了如何在实体Bean之间建立和维护复杂的数据关系。

2170

被折叠的 条评论
为什么被折叠?



