- 作者:zhaozj
- 发表时间:2020-12-23 10:55
- 来源:未知
提纲: ====================== 一、概述 1.1 持久化 1.2 共享访问 1.3 主键 1.4 关系 二、实体Bean与JDBC 三、实体EJB组件 3.1 Bean管理的持久化 3.2 容器管理的持久化 ======================== 正文: ======================== 一、概述 实体Bean代表着持久性数据存储系统(通常是数据库)中的一个实体。与消息驱动的Bean、会话Bean相比,实体Bean的特点主要表现在持久化(Persistent)、共享访问、拥有主键、关系这四方面。 1.1 持久化 实体Bean的状态信息保存在数据库之类的持久性存储系统中,因此它有持久化的特点。这意味着,即使在应用或J2EE服务器进程的生存周期之外,实体Bean的状态信息仍旧有效。实体Bean的持久化分两种类型:Bean管理的持久化(Bean-Managed Persistent,BMP),或容器管理的持久化(Container-Managed Persistent,CMP)。持久化类型可以在EJB部署描述器中声明。 对于Bean管理的持久化,开发者应当自己编写访问数据库的代码。例如,ejbCreate()执行一个SQL的插入命令,开发者必须自己构造和执行SQL INSERT命令和其他相关的调用。 对于容器管理的持久化,容器自动完成必要的数据库调用。例如,当客户程序请求创建一个实体Bean,容器就生成一个SQL INSERT命令。开发者编写的代码不包含任何SQL调用。容器还能够自动同步实体Bean的状态信息与数据库中保存的数据,这些状态信息通常称为“容器管理的域”(Container-Mananged Field)。容器管理的域也在部署描述器中声明。 容器管理的持久化具有两个显著的优点:首先,容器管理持久化的实体Bean代码量较少;第二,由于Bean不包含任何数据库调用,因此它具有中立于数据库类型的特点。当然,这些优点有时会变成局限,在一些需要高度灵活性的场合,Bean管理的持久化将是首选的方案。例如,当容器不支持CMP实体Bean,或者开发者想要对数据处理方式拥有更多控制权,或者某个数据源过于复杂、难于实现高效的CMP实体Bean映射时,我们应该选用BMP实体Bean。 1.2 共享访问 实体Bean可以由多个客户程序共享。由于多个客户程序可能修改同一个数据,因此,为实体Bean提供事务(Transaction)支持就很重要。一般地,事务管理机制由EJB容器提供,开发者无需在Bean里面设置事务的界限。事务属性可以在Bean的部署描述器中指定。 1.3 主键 每一个实体Bean有一个唯一的对象标识符。例如,一个Customer实体Bean可以通过客户编号识别。实体Bean的唯一标识符也称为主键(Primary Key),它使得客户程序能够定位特定的实体Bean实例。当EJB客户程序通过实体Bean的接口创建或寻找特定的数据库记录,容器把一个主键关联到返回给客户程序的EJB实体Bean句柄。例如,如果在Customer实体Bean里面,客户的名称是主键,则对于容器来说,这个名称应该唯一地标识出数据库里面Customer表的一个记录;从客户程序的角度来看,它映射到了一个唯一的实体Bean实例。 1.4 关系 正如关系数据库中的表,实体Bean之间也可以建立关系。关系的实现方式根据持久化类型的不同而不同。对于Bean管理的持久化,关系需要开发者编写代码实现;对于容器管理的持久化,关系由容器负责实现。由于这个原因,对于容器管理持久化的实体Bean,关系通常被称为容器管理的关系(Container-Managed Relationship)。 根据实体Bean的特点,推荐使用实体Bean的场合包括: 当Bean侧重于描述业务实体而不是业务过程时。 当Bean的状态信息需要持久化时。 二、实体Bean与JDBC 连接和访问数据库是绝大多数J2EE应用的基本要求,J2EE通过JDBC提供这方面的支持。一些厂商(如Oracle)以及下一版本的J2EE规范将支持通过SQLJ访问数据库,但本文仍以JDBC为基础介绍数据库访问。J2EE平台提供对JDBC API的支持,允许我们方便地通过XML形式的部署描述器配置JDBC资源,通过JNDI连接JDBC资源。 JDBC驱动程序的配置、数据源的声明通过XML格式的J2EE模块部署描述器完成。会话Bean和实体Bean都可以在J2EE部署描述器中定义 元素,每个EJB可以配置零个或多个JDBC资源。 例如,下面的例子显示了如何在ejb-jar.xml文件中为实体EJB配置JDBC资源: