《jbuilder9+weblogic7实战篇》由会员分享,可在线阅读,更多相关《jbuilder9+weblogic7实战篇(22页珍藏版)》请在金锄头文库上搜索。
1、JBuilder9+Weblogic7 实战篇 ENTITY BEAN 的运用(一)一、 Entity Bean 的基础理论1.1 什么是 Entity BeanEntity Bean(实体 Bean)是持久数据组件,代表存储在外部介质中的持久(Persistence)对象或者已有的企业应用系统资源。简单地讲,一个Entity Bean 可以代表数据库中的一行记录,多个客户端应用能够以共享方式访问表示该数据库记录的Entity Bean。那么什么是持久数据组件呢?为什么要使用持久数据组件?理解了这两个问题,也就清楚了Entity Bean 的性质及用途。持久数据组件指的是这样一种对象,它们知道
2、如何将自身放入持久存储的空间中。它们使用一些持久机制,比如序列化、O/R 映射。这种对象代表数据,例如使用持久数据组件代表下面这些信息: 银行帐号信息,例如帐号、密码和余额; 员工信息,例如姓名、部门和工资。为什么要把这些数据以对象的方式进行处理而不是直接处理数据库中的原始数据,比如相关的记录呢?答案是将数据视为对象是非常便利的,因为能够方便地操作和管理对象,并且它们表现为一个紧凑的形式,此外,通过组件所在的应用服务器,可以获得事务、安全性等服务。Entity Bean 就是这种持久数据组件。Entity Bean 知道怎样在一个诸如数据库的存储空间中永久保存自己。Entity Bean 以域
3、( field)的方式存储数据,例如银行帐号、密码和余额。依赖于 EJB 容器提供的事务服务,多个客户端应用能够在保持数据库记录的一致性和完整性前提下实现对数据资源的共享。Entity Bean 的生命期相对较长并且其状态是持续的。只要Entity Bean 代表的数据库记录存在,该组件对象实例就一直存在,即使EJB 容器崩溃, Entity Bean 仍然具有生命力。1.2 Entity Bean 的子类型按照 Entity Bean 持久性的实现形式,可以将Entity Bean 分为容器管理持久性(CMP Container-Managed Persistence)和组件管理持久性(BM
4、P Bean-Managed Persistence)两种模型。在CMP 类型 EJB 组件的实现代码中,组件开发人员不需要为组件的持久性控制方法编写任何数据库操作的代码,而是在组件组装和部署过程中由部署工具自动创建;如果要创建 BMP 类型 EJB 组件,则组件程序设计人员需要为所有持久性方法编写控制代码。1.3 Entity Bean 的特点与数据库中的数据记录相对应,每个实体类型EJB 组件包含一个主键(Primary Key)标识,该标识与组件代表的数据库记录主键相同。客户端应用可以利用该主键定位EJB容器中的 Entity Bean 对象实例,进而定位组件代表的数据库记录。实体类型
5、EJB 组件的主要特点包括: Entity Bean 提供数据库中记录的视图; Entity Bean 具有无限制生命期,EJB 服务器崩溃也不会影响Entity Bean 的存在; 多个 Entity Bean 可以对应同一数据库记录; EJB 服务器可以利用Entity Bean 的 passivate 方法将 Entity Bean 缓存到临时存储空间中,同样可以利用activate 方法将缓存的Entity Bean 重新读入 EJB 容器并恢复组件对象实例; 客户端应用可以利用在Entity Bean 的 Home 接口中定义的创建、删除和查询等方法对组件进行管理。二、创建 Enti
6、ty Bean2.1 准备首先在 Oracle9i 数据库建立表student 和 locker,建表的 SQL 脚本如下: student 表的脚本:create table student(stuid integer primary key,stuname varchar(50),lockerid integer);insert into student(stuid,stuname,lockerid) values(1,“student1“,1);insert into student(stuid,stuname,lockerid) values(2,“student2“,2);inser
7、t into student(stuid,stuname,lockerid) values(3,“student3“,3); locker 表的脚本:create table locker(id integer primary key,lockername varchar(50);insert into locker(id,lockername) values(1, “locker1“);insert into locker(id,lockername) values(2, “locker2“);insert into locker(id,lockername) values(3, “lock
8、er3“);在此之前请参照 JBuilder9+Weblogic7 实战篇之工具篇( JDBC 1)配置好数据库的连接池和 Tx 数据源。2.2 创建 Entity Bean2.2.1 启动 Jbuilder9,新建一个工程cmpSample;2.2.2 单击 Enterprise 子页;2.2.3 选择 EJB Module 然后单击 OK,出现 EJB Module 窗口;2.2.4 在 Name 后输入 Cmp;2.2.5 将 Version 更改为 EJB 2.0 compliant;2.2.6 单击 OK。 EJB 的设计在文档窗口中进行。2.2.7 通过从数据库中引入模式(Sche
9、ma)的方式建立与student 表对应的 Entity Bean。在文档窗口按鼠标右键,单击Import Schema From Database 菜单项;2.2.8 在“Database Schema Provider”界面中设置数据库连接信息。各项设置如下: Driver: 在下拉列表中选择oracle.jdbc.driver.OracleDriver; URL: jdbc:oracle:thin:localhost:1521:kkdb Username: TEST Password: TEST Database name: kkdb JNDI name: jdbc/testTxData
10、Source完成后可以在左侧 “DataSources”窗口中看见数据库中所有表的视图。2.2.9 在 STUDENT 上按右键,单击Create CMP 2.0 Entity Bean 菜单项,建立与student 表相对应的 CMP。2.2.10 设置 Entity Bean 的信息在 EJB Designer 窗口中单击 Student 项,进行设置。在这里,只需设置接口类型(Interfaces)为 local/remote(表示同时生成两种接口),其他各项均使用默认值即可。各项含义如下: Bean name: Entity Bean 的名字; Abstract schema name
11、: 抽象模式名; Interfaces: 对外接口类型,选择local、remote 或 local/remote; Always wrap primary key: 是否总是保护主键; Class and packages 按钮: 设置产生类名和包名 单击某一属性,可以设置该属性的信息。例如设置属性的名称、数据类型、是否为主键、是否作为 ejbCreate 方法的参数等。这里我们默认值。2.2.11 在工程窗口 cmpSample.jpx/Cmp 按右键,单击Make 菜单项,生成Cmp.jar 文件。 2.2.12 启动 Weblogic Server。2.2.13 工程窗口 cmpSam
12、ple.jpx/Cmp/Cmp.jar 按右键,单击Deploy Options for Cmp.jar/Deploy 菜单项进行部署。三、 Entity Bean 的组成Entity Bean 是由 Bean 类和接口文件组成。接口文件包括对外和Home 接口。对外接口有两种:远程接口(Remote Interface)和本地接口( Local Interface)。 Home 接口是与对外接口保持一致的,即每一种对外接口对应一种Home 接口。结合刚才我们创建的Entity Bean(CMP 类型)的实例讲解各个组成部分。3.1 Bean 类与 Session Bean 一样, Bean
13、类中封装业务逻辑。在Session Bean 中通常封装的是操作, Entity Bean 是代表数据的,所以Entity Bean 应该封装的是数据(或对数据的存取操作)。以 Student 这个 CMP 为例, Bean 类中除了几个EJB 都要有控制 EJB 生命周期的方法(如 ejbCreate()、ejbRemote()、ejbPostCreate())外,与具体应用相关的方法主要是一组get/set 方法。每一对get/set 方法对应于数据表中的一个字段,例如student 表中有一个 stuid字段,在 Entity Bean 中对应有一组方法setStuid()和 getSt
14、uid()。还有一点要注意的是CMP 类型的 Entity Bean,其 Bean 类是一个实现了EntityBean接口的抽象类。里面的方法不用开发人员自己编写,原因是CMP 的持久性操作(例如对数据库字段的存取)是由容器实现的。如果开发BMP,那么 Bean 类就不是这种结构了,Bean 类应该是实现EntityBean 接口的具体类,而且要加入访问持久性数据的代码(例如JDBC代码)。CMP student 的 Bean 类的定义参见StudentBean.java。3.2 本地接口( Local Interface)本地接口是对外接口的一种,在Entity Bean 中本地接口是比较常
15、用的。因为在一个J2EE 应用系统中,通常由Session Bean 访问 Entity Bean,对于运行于同一应用服务器中的 EJB,使用本地化接口可以大大提高访问效率。该接口定义了EJB 的业务方法。CMP student 的本地接口的定义参见Student.java。3.3 远程接口( Remote Interface)远程接口是 EJB 的对外接口,定义了EJB 的业务方法,远程客户端程序对EJB 的访问是通过该接口完成的。CMP student 的远程接口定义参见StudentRemote.java。3.4 Home 接口Entity Bean 的 Home 接口定义了 Entit
16、y Bean 的生成及查询操作。该接口必须定义的两个方法是 create()方法和 findByPrimaryKey()方法。 Create()方法定义了生成Entity Bean 的操作, findByPrimaryKey()方法定义了按照主键查询Entity Bean 的操作。严格地讲,这些方法仅仅定义了这些操作的一种规则,例如生成Entity Bean 时的参数个数、具体实现是由容器来完成的。以 student 的 Home 接口为例, create()方法的定义如下:public Student create(BigDecimal stuid) throws CreateException;create()方法的参数是与student 数据表的主键stuid 对应的,因为调用create()方法会建立一个新的 Entity Bean,相应要在数据库中建立与Entity Bean 相对应的一条记录,记录的 stuid 字段