Enterprise JavaBeans 入门 实体 Bean 和 CMP

什么是一个实体(Entity) Bean
  • 一个持久对象
  • 通常它是被当成一样"东西",或者会长期存在的
    • BankAccount
    • Employee
    • Order
  • 不仅仅只是数据--状态和行为,与常规对象一样
在数据库中的实体 Bean

一个实体 bean 直接映射到数据库中的一行数据

IDLASTNMMGRDEPTSALARY
...............
42"Joe"Smith055000.0
97"Bob"Jones4240000.0
102"Mary"Chen98763000.0
...............
  • Employee
  • id: int
  • first: string
  • last: string
  • Salary: double
  • Managerld: int
  • Dpartmentld: int

Entity Bean 和 Persistence

  • 根据规范定义,实体 Bean 一旦被创建后就存在
  • 它们被直接写到数据库中
  • 可以不受任何服务器的宕机影响
  • Create 方法必需提供足够的信息将 Bean 保存到数据库中

实体 Bean 与 会话 Bean 的区别

      • 实体 Bean
      • 持久对象; 不受服务器宕机影响
      • 有一个主键; 可以被搜索到
      • 可以被共享
      • 必需被显式删除
      • 会话 Bean
      • 不是持久的; 受服务器宕机影响
      • 不可以被搜索
      • 通常一个用户使用一个 bean
      • 过一段非活动期后将被自动回收

      Aside: 什么是一个主键?

      • (一个或多个)域可以唯一地区别一行数据/一个 bean--用来查找和更新数据/对象
      • 在数据/对象的生命周期中是不变的--主键是基于不变的数据
      • 主键通常是生成的而不是基于"活跃"的数据
        • SSN 显然适合于作为一个主键
        • 就算错误选择的主键不能再被修改

      Aside: 什么是一个关系型数据库?

      数据库: 一组数据集合可以被检索和查找--一个关系型数据库维持不同行数据间的关系

      数据被组织成表格--外键(Foreign Key)用来映射关系、Structured Query Language (SQL) 用来操作数据库

      读 (select), 写 (insert, update), 删除 (delete)

      同步访问的控制

      容器管理同步访问--线程获得对 Bean 的独有访问、即 Bean 的每个方法是 synchronized

      警告: 当心死锁!

      • Bean 本身也是客户!
      • Client 1 有对 Bean 1 的独有锁
      • Client 2 有对 Bean 2 的独有锁
      • Bean 1 必需等待 Client 2 的结束
      • Bean 2 必需等待 Client 1 的结束
      • 没有任何一方得到锁!

      实体 Bean 有主键

      主键用来唯一地区别 bean--类似于数据库主键的概念

      主键类:必需反映 bean 类的"关键"状态、必需提供 equals(...) 和 hashCode() 方法

      主键可能由多个域组成

      ...
      Employee employee 
      = employeeHome.findByPrimaryKey(new EmployeeKey(42));
      ...

      Create 方法

      Home 定义了一个或多个 "create" 方法--在创建后,Bean 必需马上被写到数据库

      EmployeeHome method
      Employee create(int arg1, String arg2, String arg3) 
      throws CreateException, RemoteException
      EmployeeBean method
      public void ejbCreate(int argId, String first, String last) 
      throws CreateException, RemoteException {
      	id = argId;
      	setFirst(first);
      	setLast(last);
      	setManagerId(0);
      	setDepartmentId(0);
      }

      Post-Create

      对每个 ejbCreate 方法必需有一个 ejbPostCreate--有相同的参数

      • 容器将:
      • 调用 ejbCreate(...) 方法, 它将返回所创建实体的一个主键
      • 创建对应该主键的一个 EJB 对象引用
      • 调用 ejbPostCreate(...) 方法通知实例来完全初始化它本身
      public void ejbPostCreate(int argId, String first, String last) 
      throws CreateException, RemoteException {
      }

      Finder 方法

      Bean home 接口定义了 "ejbFind" 方法---通过 VAJ 的 Persistence Lay, 容器提供一个实现

      方法将返回:---单个结果的 Remote 接口、多个结果的 Enumeration

      Must be provided
      Employee findByPrimaryKey(EmployeeKey key) 
      throws RemoteException, FinderException;
      Employee findById(int id) 
      throws RemoteException, FinderException;
      Enumeration findByLastLike(String pattern) 
      throws RemoteException, FinderException;
      Enumeration findBySalaryRange(double low, double high) 
      throws RemoteException, FinderException;

      生命周期

      Container-Managed Persistence

      • 容器管理 Bean 的生命周期--何时创建、载入、存储和删除
      • 容器提供存储机制--如何创建、载入、存储和删除
      • Bean 部属人员定义 Bean 和数据库之间的映射

      VisualAge 和 CMP

      • VisualAge 提供工具来:
      • 从一个数据库模式(schema)来创建 Bean
      • 从实体 Bean来创建数据库模式
      • Meet in the middle: 利用现有的 Bean 和模式

      构建一个实体 Bean

      容器管理的域...

      当 Bean 被创建时可以定义域

      中间的屏面可以切换 Bean 类和域---使用这个功能来定义额外的容器管理的域

      模式(Schema)和映射(Map)

      • 模式(Schema)
      • 描述数据库模式
      • 将原始数据转换成 Java 类型
      • 将 Java 类型转换成原始数据
      • 映射(Map)
      • 定义如何从模式中的一行数据构造对象
      • 定义如何从一个对象构造数据行

      生成数据库模式

      添加一个模式和映射--"EJB > Add > Schema and Map from EJB Group"

      导出模式导数据库--打开 Schema Browser

      Aside: JDBC

      • JDBC 驱动程序
      • 描述 Java 和一个数据库之间的接口
      • 作为一个 Java 类而实现
      • 一般由数据库厂商提供
      • JDBC URL
      • 描述数据库位置(如何查找)
      • 部分格式是各厂商定义的

      生成库表

      大多数 DBA 嘲笑数据库表的自动生成--有个理由: 高效的库表设计需要精心考虑

      生成的库表足以供测试使用

      CMP 提供了在您的 Bean 和存储机制间的屏蔽--在测试时使用自动生成库表, 部属时另外考虑

      "FinderHelper" 类

      • 为每个 finder 方法定义 "where" 语句
      • "?" 被参数值替换(按次序)
      • WebSphere 独有
      Employee findById(int id) throws ...
      Enumeration findAll() ...
      Enumeration findByLastLike(String pattern) ...
      Enumeration findBySalaryRange(double low, double high) ..
      public interface EmployeeBeanFinderHelper { 
      	public static final String findByIdWhereClause = "ID = ?";
      	public static final String findAllWhereClause = "1 = 1";
      	public static final String findByLastLikeWhereClause 
      = "LAST LIKE ?";
      	public static final String findBySalaryRangeWhereClause 
      = "SALARY > ? and SALARY < ?";
      }

      Aside: 设置 DB2

      VAJ 的工作区必需能够访问 DB2 驱动程序--使用 "Window > Options..."

      创建一个数据库

      • 使用 DB2 的控制台来构建一个数据库
      • 参考 Smartguide 中的指示
      • VisualAge 为您自动生成库表

      本章讲述内容

      • Entity bean 是持久的对象具有较长的生命 (相对)
      • Entity bean 被直接反应到数据库中--它们可以跨服务器的宕机而存在
      • Entity bean 可以被查找到
      • Entity bean 的属性可标注为 container-managed 或者作为其主键的一部分
      • 在 "Finder Helper" 中可以指定 "Where" 语句
      • 0
        点赞
      • 0
        收藏
        觉得还不错? 一键收藏
      • 0
        评论
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值