SCA(Service Component Architecture)作为服务组件体系结构,将所有的集成构件都描述为具有定义明确的接口的服务组件。SCA 还引入了模块的概念,它将服务组件集中到一起,并提供服务的进一步说明和封装。这意味着只要模块的接口保持不变,就可以在不影响整个解决方案中的任何其他模块的情况下更改模块内的服务组件。服务组件的实现可以是Java 对象(例如POJO或者SLSB), BPEL,Human task,业务状态机以及业务规则集合等。
服务数据对象(Service Data Objects,SDO)是SOA体系结构中的一个用来简化和统一数据应用的开发框架,也是SCA Module的基本组成部分。SDO支持与XML的集成并且适用于J2EE模式和最佳实践。与其他的数据集成模型不同,SDO不仅仅是数据的抽象,SDO框架也是一个断开连接的编程模型,即可以在不连接任何数据源的情况下进行编程。
Hibernate是一种Java语言下的对象关系映射解决方案,Hibernate不仅负责从Java类到数据库表的映射,还包括从Java数据类型到SQL数据类型的映射,并且还提供了面向对象的数据查询检索机制,从而极大地缩短的手动处理SQL和JDBC上的开发时间。
本文主要由两部分内容组成:
1. 讨论如何以Model Driven的方式,构建SCA模块以及生成实现。
2. 讨论如何引入Hibernate实现SCA Module的持久层,并结合示例讨论如何针对类与类之间的各种映射关系定义 Hibernate映射文件,以及如何调用Hibernate API操作JavaBean来实现对数据库对象的访问。
文中涉及到的建模和代码实现都是在WebSphere Integration Developer v6.0开发并基于 WebSphere Process Server v6.0上测试完成的,使用的数据库是DB2 v8.2。
二、先决条件
开始之前,希望读者对如下知识有一定了解:
SOA:Service Oriented Architecture 面向服务的体系结构
SCA:Service Component Architecture 服务组件体系结构
SDO:Service Data Object 服务数据对象
Hibernate:一种Java语言下的对象关系映射解决方案
三、创建示例项目
1. 示例项目背景介绍
我们引入一个证券业的简单实例来说明整个过程。
如果您想从事证券投资,就需要去证券公司开立一个交易账户。开户时,证券公司需要把您的个人信息注册到股东表中,并且对您购买的股票进行记录以进行后续的证券买卖结算。基于这个场景, 我们将基于SCA把建立个人证券账户相关的业务功能构建为服务组件,在实现服务组件时采用Hibernate来快速完成数据对象与SDO之间的映射工作。
我们用以下的用例图来描述这个场景:

图-1:用例图
根据这个场景,我们需要为股东,证券,证券类别,股东证券账户等实体创建相应的Java对象,用下面的类图来描述这些 Java对象以及它们之间的关系:

图-2:类图
在创建图-2所示的类图时,我们同时也创建了对应的Java类。这种Model-Drive的开发方式,省却了再次手动创建Java类的繁琐,并且可以实现类图和代码上对Java类进行同步更改。
根据上面的背景介绍,为了构建一个服务组件来提供与建立个人证券账户相关的业务功能的服务,我们将构建一个名为 StockService的组件,该组件实现以下业务功能:
清单-1:业务功能列表
名称 功能
addStock 新增一个证券
addStockType 新增一个证券类别
addStockAccount 新增一条证券账户信息
addStockHolder 新增一个股东
getStockList 获得某个股东的所有证券信息列表
getStockAccountListByStockId 根据证券代码获得具有该证券的股东账户列表
getStockTypeList 获得所有的证券类别列表
为此,我们按照以下步骤创建Module项目以及相关的SDO和Interface。
2. 创建StockModule项目
我们为StockService服务组件示例创建一个新的workspace,例如,本文所用示例的workspace路径为: d:\workspace\soa。然后,切换到Business Integration视图下。
选择菜单File->New->Others打开新建项目窗口,选择Business Integration菜单中的Module,如下图所示:
图-3:新建Module窗口

将新建的Module命名为:StockModule,如下图所示:
图-4:新建Module窗口

3. 创建SDO
作为构建StockService的基础,我们须根据类图定义模块所需的SDOs:
清单-2:需要创建的SDO属性列表
SDO名称 属性 SDO字段类型 说明
StockType:证券类别 id string 证券类别代码
stkTypeName string 证券类别名称
StockTypeList:证券类别列表 stockTypes[] StockType 证券类别列表
Stock:证券 id string 证券代码
stkName string 证券名称
stkType StockType 证券类别
StockList:证券列表 stocks[] Stock 证券列表
StockMemo:证券相关信息 stock Stock 证券
currentPrice double 当前价格
highestPrice double 最高价
lowestPrice double 最低价
StockHolder:股东信息 id string 股东代码
name string 股东姓名
gender string 性别
idCardNum string 身份证号码
email string 电子邮箱
address string 地址
StockAccount:股东-证券账户信息 stockHolder StockHolder 股东信息
stock Stock 股东所拥有的证券信息
balance int 当前余额
profit double 盈余
stockMemo StockMemo 证券价格信息
比较复杂的是StockAccount,下图反映了StockAccount与StockHolder,Stock,StockMemo之间的引用关系:
图-5:SDO之间的关系

4. 创建StockServiceInterface
该接口将定义清单-1中所列的业务功能,我们将该接口命名为:StockServiceInterface,创建完毕的接口如下图所示:
图-6:StockServiceInterface接口定义

StockModule项目在Business Integration视图下犹如下图所示:
图-7:StockModule项目资源情况

5. 为StockModule增加接口
双击图-7中的红色部分,打开StockModule的Assembly Diagram,右键单击StockService,在弹出菜单中选择Add->Interface,将StockServiceInterface加入到StockService组件中。
图-8:StockModule的Assembly Diagram:

6. 为StockService组件导出WS绑定
在图-8所示的Assembly Diagram中,在StockService组件上点右键弹出的菜单中,选择export分别为该组件导出Web service绑定,命名为StockServiceExport,然后为StockService增加一个Stand-alone References,以使得StockService 组件具有为本地客户端提供服务的能力。
图-8:为StockService导出的Web service绑定
7. 自动生成Module的Java实现代码
在图-8所示的Assembly Diagram所示的StockService组件上点右键弹出的菜单中,选择Generate Implementation (如果已经生成过Java实现,则为Regenerate Implementation)来自动生成Java实现代码。