实战EJB系列
在以后的日子里,将由Jackliu向大家陆续提供一系列EJB教程,有学习EJB的朋友请同步参考EJB相关书籍,实战系列将以例程的方式帮助你理解这些基本的概念,其中将包括:
点击查看大图所有章节完毕后将制作成pdf电子文档,供大家下载。
实战EJB之四 开发实体CMP(EJB 1.1规范)
在前面的几篇文章里我介绍了如何开发会话Bean,下面将向大家介绍如何开发Entity Bean,首先充实一些关于Entity Bean的基本知识。
实体(entity) bean用来代表底层的对象,最常用的是用Entity Bean映射关系数据库中的记录。在一个Entity Bean中,关系型数据库的字段可以被一对一的映射到一个Entity
Bean中,而表与表之间的关系就可以看成是Entity Bean之间的关系。一个Entity Bean的实例可能会对应表中一个特定的行记录描述或者对于一个查询结果。比如我们在数据库中设计了一个BOOK表,一个相对于BOOK表的Entity
Bean就可以封装表中的部分或全部字段,当客户端获取一个Book Bean的实例引用时,就如同我们使用一个SELECT语句从数据库中检索了一条特定的关于一本图书的记录,并可以通过对象方法的方式去访问记录的值,当然你也可以使用remove方法去删除这条记录,用setXXX去改变某个字段的值,新的EJB
2.0查询语言(EJB QL,EJB 2.0 query language)使你可以通过SELECT的方式直接从组件池中查询Bean。
由于这种Bean对应于数据库中的记录,所以数据库记录的任何改变也应该被同步到我们的组件池中相关的Bean中,这个过程被成为持久性(persistencd),这是Entity
Bean最重要的一个特征。根据持久性的治理者的不同分为:容器治理持久性(CMP,Container-Managed Persistence)和Bean治理持久性(BMP,Bean-Managed
Persistence)。何谓容器治理者,就是在Bean与基础数据库表记录值之间负责同步工作的操作者。
CMP Bean的持久性由EJB容器负责持,Bean开发者不需要参与操作数据库的代码部分,与数据库的操作在部署EJB时由EJB部署者描述,由容器实现SQL操作和同步工作。BMP
Bean的持久性由Bean负责,也就是由Bean开发者负责与数据库交互的代码部分。
Entity Bean支持EJB的1.1和2.0规范,并且不能同时支持两者,我们将按照规范1.1和2.0分别介绍BMP和CMP的特性,本节将主要介绍CMP
在EJB 1.1规范定义下的应用。当然上面的这些知识不足使你全部了解Entity Bean,你应该从相关的书籍或文章阅读有关的介绍。
在本节中你将了解到:
EJB 1.1规范中的CMP
Entity Bean的寿命周期
编写一个EJB 1.1 的CMP程序
部署到应用服务器
开发和部署测试程序
运行测试程序
EJB 1.1规范中的CMP
首先介绍一下容器持久性治理(CMP),然后介绍规范1.1中规定的CMP。
EJB结构的一个重要优点是EJB容器可以自动的为Entity Bean提供各种有用的功能,容器持久治理(CMP)可以使Bean开发者不用编写一行对数据库操作的代码就可以完成对数据库的基本操作,这样可以简化Bean的开发,使我们集中于纯业务逻辑部分,这也是EJB的一个目标。以为使用CMP方式编写的Bean对于数据库的操作是在部署时由部署者映射到实际的数据库字段的,所以这样就增强程序的移植性,CMP
Bean的不会为某种特定的数据库去设计。假如你还对CMP不甚了解,下面可以帮助你迅速解答你一部分疑问:
CMP Bean如何连接到数据库?
假如你是一个Bean的开发者,打消这个念头吧,因为你已经不许要考虑这些问题了!这些工作将在在部署Bean时由部署者为CMP Bean指定一个数据库连接池的JNDI命名。java应用服务器提供数据库连接池治理,并可以通过JNDI命名来获得一个引用。当我们要改变数据库类型或改变数据库的连接地址时,只需从新配置这个数据库资源即可。
CMP Bean如何映射一个数据表?
这是一个值得考虑的问题,因为这是你在设计一个具体应用是考虑使用CMP还是使用BMP的依据之一。在设计一个CMP Bean时,Bean被固定映射一个实体表,表中的每个指定字段被映射成bean的一个public型类变量,在实际开发中,只需要在Bean的实现类中声明这些类变量,映射操作和SQL处理被交于部署者和容器自动完成。当然你可以迅速的开发出一个CMP
Bean,但可能会因为复杂的数据逻辑处理而放弃使用CMP Bean而采用BMP Bean,至少在规范1.1版本,对CMP Bean规范的定义带来束缚还是比较大。
CMP Bean主键如何理解?
只有Entity Bean有主键,session调用主键方法将抛出一个异常。Entity Bean是数据面向数据对象的表示,每个Bean的实例代表一行记录,所以就必须有一个主键来标识这个对象,以能够对其进行持久性操作。