跟贴请点击 http://www.huihoo.com/cgi-bin/forum/viewthread.php?tid=1261
作者 文章标题 数据库应用的corba对象设计




新手上路



贴子数量 : 17
注册日期 : 6/8/2002
在线情况 : 离线

  发表于: 8/16/2002 - 06:12
我用jsp+bean+corba管理系统。
当中有很多实体,如订单,账户、employee等。原来的思路,是将这些实体对象封装成无状态的corba对象。即corba对象的实现的构造方法是没有主键的。但每个业务方法都有主健作参数。
现在我想仿照j2ee中实体bean那样封装,即构造方法是有主健作参数的。但问题来了,我不可能一下注册很多个employee对象,我想当客户调用的时候再去创建这个empoyee corba对象。但不知道该怎么写创建的employee对象的接口。用生命周期服务的得工厂方法创建吗?
但创建后返回的employee是没有区别的(我猜是这样),这样我的employee的接口中的每个业务方法又得包含主健作参数,是否又成了
无状态的corba对象

 
查看此人的个人资料 发送E-Mail给此人 编辑贴子 引用回复 搜索此人的所有贴子 给此人发送短消息








贴子数量 : 709
注册日期 : 10/12/2001
在线情况 : 离线

  发表于: 8/18/2002 - 14:57
对不起,对于你所提的问题我有些茫然,不知道你是要说个什么问题,是CORBA持久性对象管理、CORBA与DB的关系映射?还是...
CORBA与数据库应用的关系涉及到很多问题,愿意与你就此问题更深入探讨。
 
发送E-Mail给此人 编辑贴子 引用回复 浏览此人的主页 查看此人的所有贴子 给此人发送短消息




新手上路



贴子数量 : 17
注册日期 : 6/8/2002
在线情况 : 离线

  发表于: 8/19/2002 - 01:58
哦,没有那么复杂。
就是说,客户端想得到一个employee corba对象的引用,但这个corba对象还没有向orb注册。
我在客户端想通过调用服务端的一个方法(例如另一个corba对象的方法(f1)),服务端这个方法f1生成对象引用并向orb注册,并将对象的引用向客户返回。
关键在于客户调用的f1方法用employee的主健作参数,服务端生成一个employee corba 对象,但问题是,employee对象生成的时候,我
向数据库中插入了一条纪录。但我接着调employee的方法,emplyee对象怎么按照我的主键从数据库中读取状态?
不知道说清楚了没有,谢谢斑竹。
 
发送E-Mail给此人 编辑贴子 引用回复 查看此人的所有贴子 给此人发送短消息




版主



贴子数量 : 198
注册日期 : 11/16/2001
在线情况 : 离线

  发表于: 8/19/2002 - 02:34
看一个例子吧:

1.IDL

module BankDemo
{
typedef float CashAmount; // Type for representing cash
typedef string AccountId; // Type for representing account ids

// Forward declaration of Account
//
interface Account;

// Bank interface...used to create Accounts
//
interface Bank
{
exception AccountAlreadyExists { AccountId account_id; };
exception AccountNotFound { AccountId account_id; };

Account find_account(
in AccountId account_id
) raises(AccountNotFound);

Account create_account(
in AccountId account_id,
in CashAmount initial_balance
) raises (AccountAlreadyExists);

void shutdown_bank();
};

// Account interface...used to deposit, withdraw, and query
// available funds.
//
interface Account
{
exception InsufficientFunds {};

readonly attribute AccountId account_id;
readonly attribute CashAmount balance;

void withdraw( in CashAmount amount ) raises (InsufficientFunds);

void deposit( in CashAmount amount );
};
};

2.客户端

1).得到Bank对象(factory and stateless)的引用:
CORBA::Object_var bank_obj = orb->string_to_object(ior);
BankDemo::Bank_var bank;
try
{
bank = BankDemo::Bank::_narrow(bank_obj);
}
2).创建account对象(product and stateful)
BankDemo::Account_var account = bank->create_account(name, amount);
3).查找account对象
BankDemo::Account_var account = m_bank->find_account(name);

3.服务端


1).创建account对象
BankDemo::Account_ptr
BankImpl::create_account(
const char* account_id,
BankDemo::CashAmount initial_balance
) IT_THROW_DECL((
CORBA::SystemException,
BankDemo::Bank::AccountAlreadyExists
))
{
// Create a new account in the database, then return a new
// reference to that account.
//
if (!m_account_db.create_account(account_id, initial_balance))
{
throw BankDemo::Bank::AccountAlreadyExists(account_id);
}

return create_account_ref(account_id);
}

BankDemo::Account_ptr
BankImpl::create_account_ref(
const char* account_id
) IT_THROW_DECL((CORBA::SystemException))
{
// Convert the account id into an object id
//
PortableServer::ObjectId_var oid =
PortableServer::string_to_ObjectId(account_id);

// Create a new untyped reference for that account
//
CORBA::Object_var account_obj = m_account_poa->create_reference_with_id(
oid,
BankDemo::_tc_Account->id()
);

// Return the reference, narrowed to the Account type
//
return BankDemo::Account::_narrow(account_obj);
}


2).需要重点注意的是bank与account的POA采用不同的策略,一般采用servant locator 和efault Servant两 种方式,下面的采用Servant LOcator 方式,看看servantlocator的实现方式:

PortableServer::Servant
AccountServantLocatorImpl::preinvoke(
const PortableServer::ObjectId & oid,
PortableServer:: POA_ptr adapter,
const char* operation,
PortableServer::ServantLocator::Cookie& the_cookie
) IT_THROW_DECL((CORBA::SystemException, PortableServer::ForwardRequest))
{
// Just create a new account implementation
//
CORBA::String_var account_id = PortableServer::ObjectId_to_string(oid);
cout << "calling preinvoke for " << account_id << endl;
return new SingleAccountImpl(account_id, m_account_db);
}

// postinvoke()
//
// A ServantLocator receives a call to postinvoke whenever a request
// is finished. postinvoke is responsible for performing any per-request
// cleanup, such as deleting the servant handling the request, ending
// transactions, flushing database handles, etc.

//
// This implementation simply writes the account information to the database,
// then deletes the servant.
//
//
void
AccountServantLocatorImpl::postinvoke(
const PortableServer::ObjectId & oid,
PortableServer:: POA_ptr adapter,
const char* operation,
PortableServer::ServantLocator::Cookie the_cookie,
PortableServer::Servant the_servant
) IT_THROW_DECL((CORBA::SystemException))
{
// Delete the servant...the servant will take care of writing to disk
//
CORBA::String_var account_id = PortableServer::ObjectId_to_string(oid);
cout << "calling postinvoke for " << account_id << endl;
delete the_servant;
}


这个例子与你的是不是有点相象,关于如何再找到你说的emplyee对象,我想重点需要用到servant locator程序。


 
发送E-Mail给此人 编辑贴子 引用回复 查看此人的所有贴子 给此人发送短消息




新手上路



贴子数量 : 17
注册日期 : 6/8/2002
在线情况 : 离线

  发表于: 8/19/2002 - 04:52
明白了。
谢谢fat1.
 
发送E-Mail给此人 编辑贴子 引用回复 查看此人的所有贴子 给此人发送短消息

COPYRIGHT © 2001-2002 huihoo.com
E-mail:webmaster@huihoo.com