[转载]实体Bean的开发

本文详细解析了EJB2.0中实体Bean的CMR(Container Managed Relationships)特性,通过具体示例说明了一对一、一对多及多对多关系的实现方法,展示了如何在实体Bean之间建立和维护复杂的数据关系。
实体Bean的开发

分析实体Bean的应用时,会发现应用数据之间往往存在一些关系,这些数据本身对应的数据表之间存在着表项字段的关系,这些关系需要实体Bean来维护。EJB 2.0为实体Bean提供了对关系的全面支持,实现了CMR

EJB 2.0对关系的支持给开发提供了很大方便,EJB 2.0的关系包括单项关系和双向关系,从对象数量上分为一对一、一对多和多对多3种,下面将通过实例来说明。

下面School的例子要复杂一些,由5个实体Bean组成,它们之间存在着一定的关系,具体关系如图3-13所示。

image014.gifimage015.jpg

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种关系,如下所示。

1TeacherToClass关系

对于teacherclass的关系,一个老师通常会教多个班级,所以是一对多的关系。和从前一样,先定义这两个实体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之间建立关系需要定义两个实体对象,这里是teacherClass,它们之间的关系定义用如下的方式描述:

TeacherToClass

Teacher-has-Classes

One

TeacherBean

Class-belongsto-Teacher

Many

ClassBean

teacher

一个关系有两个关系角色组成,一个是由teacher指向classTeacher-has-Classes,另一个是由class指向teacherClass-belongsto-Teacher,所以一个关系的定义被分成两个关系角色的定义。

One

multiplicity用来规定一个关系角色的数量,这里的数量可以是one,即1个,或者Many,即多个。

TeacherBean

relationship-role-source用来规定关系角色的EJB对象。注意,这里使用的是EJB的名字,而不是JNDI的名字。

teacher

最重要的是cmr-field, CMRContainer 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简化了我们开发数据表之间关系的实现过程。

2ClassToClassroom关系

与前面的关系不同,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,这让你懂得了关系的用法,下面的这个关系示例要复杂一点。

3ClassToStudents关系

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指定集合对象时提到过两种集合类CollectionEnumeration,这里我们仍然可以使用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);

StudentBeanstudent的实现类)中加入如下内容:

public abstract ClassLocal getMyclass();

public abstract void setMyclass(ClassLocal myclass);

4StudentToGrade关系

这个关系是一个学生和年级之间的一对一关系,在这个例子中两个关系角色各包含一个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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值