您现在的位置: 中国教师站 >> 教师关注 >> 电脑技术 >> 编程技术 >> Java >> 正文

Google
win2k环境下基于JBOSS的J2EE开发实践----之四:BMP实体
作者:Siny 文章来源:中国教师站cn-teacher 点击数: 更新时间:2007-4-22 13:23:21

win2k环境下基于JBOSS的J2EE开发实践

     ----之四:BMP实体Bean的编写与设计

说明:本教程发表于csdn.net网站(中国程序员网)文档中心,任何人转载请注明出处,并且保留此说明。作者本人在发表此系列文章后,许多网友来信要求作者继续编写此教程,作者在此处首先感谢广大网友的信任!作者联系地址为:josserchai@yahoo.com。

前言: 在《WIN2k环境下基于JBOSS平台的J2ee开发实践》系列文章中,我将通过不采用任何自动化工具带领读者来实现EJB开发,我们在全过程中,自己编写EJB类,自己配置容器环境和自己编写布署描述符文件等,使大家在学习EJB开发过程中深入地理解EJB的开发过程并掌握它。在前面三节中,我们带领大家配置好了开发环境和数据库连接池,并演示了如何开发SessionBean的方法。在这一节中,我们将学习如何开发实体Bean。

一、实体Bean编程基础


在J2ee的面向对象的多层配置架构中,我们通常会使用以下两种有明显区别的组件:

1、应用逻辑组件,它们是执行公共任务的方法提供者,它们完成的工作我们可以理解为是一个短暂的过程,如计算一个订单的价格、计算一个方程的解等。

会话Bean可以很好的完成这些应用操作,会话Bean常常包含用于执行应用任务的运算逻辑,它代表一个客户的一次操作或与用户工作流逻辑的一次用户会话过程。

2、持久数据组件,它是多层商务应用中的一个对象,如银行应用中的账户、商业客户等。这些对象代表的是你在商务应用中可能需要保存的数据。

如:你编写了一个Account类,它代表的是银行的账户,它的一个对象实例即代表银行中的一个具体的账户。也许这时你会怀疑这种对象组件是否有用,你可能会问:我为什么不可以直接把这些数据存储到数据库的表中呢?如把账户信息放入一个数据库表中,需要使用时,我们再把它读出来,为什么要使用这些对象组件呢?答案有两点:

一、 我们把这些数据视为对象能够使我们非常便利地操作和管理它们,并且它们表现为一个类形式的紧凑形式。

二、 我们可以利用这些中间层对象将数据存储到容器的缓存中提高访问数据的性能,同时我们能从容器那里获得更好的关联、事务和安全性。

实体Bean就是这些持久性数据组件,它们处于数据库和用户应用程序之间,由容器负责管理它们和数据库之间的数据交互。我们可以这样简单地理解为:实体Bean是数据库和用户应用程序之间的缓存数据,它处于WEB容器的内存中,它的表现形式不是像数据库中的一行一行的记录一样,它的表现形式是一个一个的对象实例,容器中的一个实体Bean类的对象实例代表的是数据库中的一条记录。

实体Bean不执行复杂的任务或工作流逻辑,因为他们本身代表的是数据,是持久状态的对象。例如:我们要创建一个银行账户,它有三个域:账号ID、账户户主的姓名、账户上的金额。在通常情况下,我们可以在数据库的accounts表中插入一行记录即可。采用了实体Bean后,我们先在内存中创建一个账户类,它有三个属性,然后我们实例化出该类的一个对象,它在内存中代表一个具体的账户。即我们首先把数据加载到内存中,然后,你可以处理这个内存中对象并改变它,这时你操作的是一个Java对象而不是一大堆的数据库记录,如:你改变了该账户的余额,此时,EJB容器会自动将你对该对象的改变映射到对应的数据库记录中去,这个过程是由容器负责执行的。即,我们负责改变这些代表数据的对象,EJB容器负责这些对象和数据库记录之间的同步。具体来说,它是怎么样同步实体Bean对象和数据记录的呢?

这个同步过程,需要我们了解实体Bean的生命周期,我们在此简要说明同步过程如下:当我们在EJB容器中创建(ejbCreate)一个实体Bean时,容器将一条数据记录读入(ejbLoad)到此实体Bean的属性域中形成一个特定的实体Bean对象(EJBObject),然后我们就可调用此实体Bean的一些方法来操作它的数据,当此Bean对象的某些数据值发生改变时,容器即调用实体Bean的一个叫ejbStore()的方法将改变后的数据更新到数据库的表中;当数据库表中的值发生改变后与当前内存中的实体Bean对象的数据值不一致时(如我们直接更改数据库记录),EJB容器即自动调用实体Bean的一个叫ejbLoad()的方法将数据库中的值重新装入到实体Bean的属性域中。当我们在EJB容器中删除一个实体Bean对象实例时,容器即调用实体Bean的一个叫ejbRemove()的方法,在此方法内,再将实体Bean的数据存储到数据库表中去。同时,由于数据库中可能有许多条记录,所有我们在EJB容器中也可能存在许多个对应的实体Bean的实例对象,那么我们用什么办法来区别这些实体Bean实例对象呢?就像数据库表中用主键来区别这些记录一样。答案是:我们也给每一个实体Bean来一个主键,用它的主键来区分这些实体Bean对象。如一个银行账户的对象我们可以用账户ID来区分它们。同样的,我们也可以像查找数据库记录一样的来查找实体Bean对象,这需要我们自己编写查找方法。

在实体Bean中,同样也存在如SessionBean中的钝化、活化的现象,这时容器分别调用实体Bean的ejbActivate()和ejbPassivate()方法。为了达到与数据库的记录一致性,在ejbPassivate()方法之前应调用ejbStore();在ejbActive()方法之后应立即调用ejbLoad()方法。

在EJB2.0规范中说明了,实体Bean(EntityBean)包括两种,即容器管理的实体Bean和Bean自身管理的实体Bean。二者区别是:Bean自身管理的实体Bean由我们Bean编写者去实现上面所讲的ejbLoa()和ejbStore()等方法,由我们控制如何去ejbLoad和ejbStore等。而容器管理的实体Bean则不用我们编写ejbLoad()和ejbStore()等方法,由容器去自动实现这些过程。


二、BMP实体Bean的编写方法与范例BMP实体Bean的编写


编写BMP实体Bean和编写SessionBean大体相同,但多了些东西,多的是:编写主键类和编写查找实体Bean的查找方法。同时,BMP实体Bean我们还要求自己来实现ejbLoad()和ejbStore等方法。下面我们就来实例来做一个BMP实体Bean,我们这个例子采用的是一个代表银行账户的Bean,我们定义一个银行账户有三个域:账户ID、户主姓名和账户金额,其中账户ID是主键。

首先我们在mySQL数据库中建一个数据库名为test,然后再在此库中建一个表accunts,如下的sql语句可以实现:

create table accounts(
id varchar(64),
ownerName varchar(64),
balance double(13,2),
primary key(‘id’));

接着,我们需配置JBOSS的数据库连接池,以便我们在BMP实体Bean中连接数据库,我们在这里采用mySQL数据库,配置方法详见本系列教程第二节,具体就是在JBOSSServeralldeploy目录下新建一个mysql-ds.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>MySql</

[1] [2] [3] [4] [5] [6] 下一页

相关专题:
 
 网友评论:(评论内容只代表网友观点,与本站立场无关!)
GOOGLE广告

阅读排行

| 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 |
中国教师站

中国教师站 版权所有 Copyright © 2006-2020 All Rights Reserved 站长:Sina & Siny
[备用域名:www.JXZYW.Com] 有事请留言有事请留言
【实力成就精品 诚信呵护品牌】

信息产业部备案
苏ICP备06018635号