数据和服务 – 通向企业服务总线(ESB)之路

在前面的章节中,我们已经学习了XML的基础知识以及基于XMLWeb服务。现在,我们就可以从企业级的视角,看看这些是如何组装起来。对企业用户来说,信息及信息的基本构成元素数据是他们所感兴趣的。数据可以驻留在任何数据存储中心,并以各种形式存在。如果不考虑数据存储和格式,您需要将数据存到表中,并应用企业业务逻辑对它们进行处理,然后它们才能变为信息提供给用户。那么,在SOA世界,我们怎样才能从传统的JDBCORM(Object-relations mapping, 数据关系映射)中解脱出来?而且,更加另我们感兴趣的是,数据甚至可以以服务的形式存在,如果是这样,我们怎样将多个服务组合起来,并对它们进行查询,就象我们将多个JDBC查询结果组合起来那样?在本章中,我们将看一下这些问题,本章主要内容有:

JDO作为替代JDBC的可选方案;

数据服务及其在SOA中的角色;

即将出现的数据服务标准,例如SCASDO

Apache Tuscany进行介绍;

介绍MOM(message-oriented middleware,消息中间件)

企业服务总线ESB(Enterprise Service Bus)—一种全新的架构体系

介绍OpenESB

JDO简介

您对JDBCORM框架(HibernateToplink)已驾轻就熟,但现在我们却要介绍Java另外一种数据访问形式 – JDO(Java Data ObjectJava数据对象),它是一种标准实现,它使用标准的基于接口的持久化抽象模型,对数据源进行访问。最初的JDO规范(JDO1.0)相当有年头了,它基于JSR12(Java Specification 12)规范,是在Sun公司的领导下制定的。JDO现在的版本为JDO2.0,它实现了JSR243规范。从JDO2.0开始,其API的开发和参考实现都交由Apache开源社区完成,JDO也演变为Apache的一个开源项目。

为什么要使用JDO

我们都有使用JDBC从关系数据库中提取数据的编程经验。但现在的问题是,我们是否需要另一种标准 – JDO来访问数据?作为一名软件开发者,如果您认为您需要对您的业务问题提供解决方案,您会从业务用例开始(business use cases),分析业务逻辑,最后得到业务域对象模型(BDOMBusiness Domain Object Model),这样做是很明智的。因为业务域对象模型(BDOM)将会指导您对实体类进行设计,这些实体类将被持久化,因此,它们可以用来存储数据;一旦您完成实体类及它们之间的关系的设计,接下来的问题是,您是否应该编写代码创建表,并持久化数据或查询表(在没有数据表的情况下,可以是其它种类的数据源)中的数据?我对这个的问题的答案是“否”。因为您写的代码越多,您出错的几率就越大;再者,开发人员的时间是宝贵的;而且,技术也在不断更新,今天您也许使用JDBC实现上面所提的“技术性功能”,明天您也许想把关系数据库中的数据迁移到另一种数据存储中,这时,您就会修改您所有的JDBC代码,以适合新的标准。在这种情况下,JDO就可以派上用场了。下面我们先来小结一下JDO不同于其它类似框架的特色:

分离关注点:使用JDO,应用开发者可以专注于业务领域对象模型(BDOM),而将那些数据持久化的细节(如数据的存储及提取)留给JDO

JDO是基于接口的:JDO是一种基于Java接口的编程模型,因此,所有的持久化行为,如ORM框架中的一些最常用的功能,是以元数据(metadata)的形式存在,元数据独立于您的BDOM源代码;另外,您也可以以即插即用(Plug and Play, PNP)的方式使用多种JDO实现。

数据存储方式的可移动性:持久化存储方式不管是关系型的,还是基于对象,或者只是一个XML数据库或扁平文件,JDO的实现都能支持它们。因此,基于JDO的应用是独立于底层数据库的。

性能:JDO知道如何更好地同数据存储中心进行交互,同开发者编写的代码相比,这可以提高数据访问的性能。

J2EE的集成:JDO应用可以利用J2EE的一些特点,如EJB及远程消息处理、自动分布式交易的协作、安全等这些J2EE企业级特色。

JPOX—Java持久化对象

JPOXApache的一个开源项目,它使用JDO,为Java访问异种数据源提供了一种解决方案。我们这里指的JPOX JDO支持的异种数据源,主要包括下列持久化方案四个主要方面特色的各种组合: 持久化定义:它定义了如何将您的BDOM类持久化到数据存储中;

持久化API:用来持久化您的BDOM对象的API编程接口;

查询语言:按照特定的条件来查找对象的一种语言;

数据存储:储存您的对象的底层数据保存中心。

您可以从http://www.jpox.org/处下载JPOX JDO

使用JPOXJDO示例

在本例中,我们将使用我们熟悉的订单(Order)和商品(LineItems),将它们扩展到JDO实现。假定您已下载并把JPOX库解压到您的本地硬盘。

本例中的BDOM(业务域对象模型)

为方便讨论,我们这里只考虑两个实体类,即OrderList(订单列表)LineItem(单个商品),这两个类的属性及它们的关系如下图所示:

 

上面的BDOM表明,一个订单可以包含多个商品,而一个商品属于且仅属于一个订单。

JDO中的BDOM实体类源代码

BDOM中的实体类非常简单,只为每个属性提供了gettersetter方法。接下来,这些类需要通过JDO的配置文件连接到JDO,从而可以利用JDO的持久化的能力,但这些完全独立于核心的实体类。

OrderList.java

OrderList类代表订单(Order),它有一个主键属性number

public class OrderList{

private int number;

private Date orderDate;

private Set lineItems;

// other getter & setter methods go here

// Inner class for composite PK

public static class Oid implements Serializable{

public int number;

public Oid(){

}

public Oid(int param){

this.number = param;

}

public String toString(){

return String.valueOf(number);

}

public int hashCode(){

return number;

}

public boolean equals(Object other){

if (other != null && (other instanceof Oid)){

Oid k = (Oid)other;

return k.number == this.number;

}

return false;

}

}

}

LineItem.java

LineItem代表订单中包含的每个商品,虽然JDO中可以为LineItem定义主键,但这里我们并没有为它显示地定义主键。

public class LineItem{

private String productId;

private int numberOfItems;

private OrderList orderList;

// other getter & setter methods go here

}

package.jdo

JDO需要一个XML配置文件,来定义要持久化的数据列,以及这些列使用何种JDBCJDO进行封装映射。为此,我们可以创建一个名为package.jdoXML文件,其内容如下,并把它放到和JDO实体类相同的目录中。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE jdo SYSTEM "file:/javax/jdo/jdo.dtd">

<jdo>

<package name="com.binildas.jdo.jpox.order">

<class name="OrderList" identity-type="application"

objectid-class="OrderList$Oid" table="ORDERLIST">

<field name="number" primary-key="true">

<column name="ORDERLIST_ID"/>

</field>

<field name="orderDate">

<column name="ORDER_DATE"/>

</field>

<field name="lineItems" persistence-modifier="persistent"

mapped-by="orderList">

<collection element-type="LineItem">

</collection>

</field>

</class>

<class name="LineItem" table="LINEITEM">

<field name="productId">

<column name="PRODUCT_ID"/>

</field>

<field name="numberOfItems">

<column name="NUMBER_OF_ITEMS"/>

</field>

<field name="orderList" persistence-modifier="persistent">

<column name="LINEITEM_ORDERLIST_ID"/>

</field>

</class>

</package>

</jdo>

jpox.PROPERTIES

本例中,我们将把我们的实体类持久化到关系数据库Oracle中,我们需要在jpox.PROPERTIES文件中指定主要的数据库连接参数:

javax.jdo.PersistenceManagerFactoryClass=org.jpox.jdo.JDOPersistenceManagerFactory

javax.jdo.option.ConnectionDriverName=oracle.jdbc.driver.OracleDriver

javax.jdo.option.ConnectionURL=jdbc:oracle:thin:@127.0.0.1:1521:orcl

javax.jdo.option.ConnectionUserName=scott

javax.jdo.option.ConnectionPassword=tiger

org.jpox.autoCreateSchema=true

org.jpox.validateTables=false

org.jpox.validateConstraints=false

Main.java

这个类用来测试JDO的功能,其代码如下,它首先创建两个订单(Order)对象,然后为每个订单添加几个商品,然后它持久化这些实体类对象,并通过id属性来查询返回这些实体化对象。

public class Main{

static public void main(String[] args){

Properties props = new Properties();

try{

props.load(new FileInputStream("jpox.properties"));

}

catch (Exception e){

e.printStackTrace();

}

PersistenceManagerFactory pmf =

JDOHelper.getPersistenceManagerFactory(props);

PersistenceManager pm = pmf.getPersistenceManager();

Transaction tx = pm.currentTransaction();

Object id = null;

try{

tx.begin();

LineItem lineItem1 = new LineItem("CD011", 1);

LineItem lineItem2 = new LineItem("CD022", 2);

OrderList orderList = new OrderList(1, new Date());

orderList.getLineItems().add(lineItem1);

orderList.getLineItems().add(lineItem2);

LineItem lineItem3 = new LineItem("CD033", 3);

LineItem lineItem4 = new LineItem("CD044", 4);

OrderList orderList2 = new OrderList(2, new Date());

orderList2.getLineItems().add(lineItem3);

orderList2.getLineItems().add(lineItem4);

pm.makePersistent(orderList);

id = pm.getObjectId(orderList);

System.out.println("Persisted id : "+ id);

pm.makePersistent(orderList2);

id = pm.getObjectId(orderList2);

System.out.println("Persisted id : "+ id);

orderList = (OrderList) pm.getObjectById(id);

System.out.println("Retreived orderList : " + orderList);

tx.commit();

}

catch (Exception e){

e.printStackTrace();

if (tx.isActive()){

tx.rollback();

}

}

finally{

pm.close();

}

}

}

编译并运行JDO实例程序

首先,如果您没有修改过本章下载代码中的examples.PROPERTIES文件,请编辑该文件,将其中的目录路径指向您的开发环境。在您下载的本章代码中,也包含一个README.txt文件,它也说明了编译和运行本例的详细步骤。因为我们使用Oracle来持久化实体类,我们还需要把下面两个库文件加到classpath中:

jpox-rdbms*.jar

classes12.jar

我们还需要其它一些库文件,您可以在build.xml文件中找到它们,请下载这些jar文件,并相应地修改examples.PROPERTIES配置文件中的路径。要编译本例,首先启动您的数据库服务器,然后键入ant命令编译编译它,您可以进到本书源代码的ch04/jdo目录,并执行下面的命令:

 cd ch04/jdo

ant

上面的命令将执行下列步骤:

首先,它编译Java源代码;然后JPOX库对每个持久化类的字节码进行增强;

然后,它将在数据库中创建所需的数据库模式(表的定义)

 

要执行本例,请执行下面的ant命令:
ant run

您现在可以交叉检查您的实体类是否保存(持久化)到数据库,下图显示了Oracle数据库中的订单及其子元素商品数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值