清单-22所列的代码体现了Hibernate快速实现JavaBean到数据库持久层转化的能力。这里见不到任何与JDBC相关的操作,只是针对 JavaBean的OO操作,因为Hibernate已经为我们完成了底层的JDBC API调用。
清单-22:调用Hibernate API持久化JavaBean
1 Session session = HibernateUtil.getSessionFactory().getCurrentSession();
2 session.beginTransaction();
3 StockAccount sa = new StockAccount();
… sa.setXXX(…)
4 session.persist("StockAccount", sa);
5 session.flush();
6 session.close();
如果StockHolder所包含的股东信息在数据库中不存在,则在调用session.persist(“StockAccount”,sa);之前,需要调用以下方法,先将新的StockHolder信息存到数据库中:
session.persist(“StockHolder”,sh);
可以用下列方法判断StockHolder所包含的股东信息是否已经存在:
if(session.load(StockHolder.class, st.getId()) == null)
2) getStockList方法 – 演绎DB-JavaBean-SDO之路
该方法的功能是:根据股东代码idNum得到属于该股东的所有证券信息的详细列表,如清单-21所示:
清单-23: getStockList(String idNum)定义
public DataObject getStockList(String idNum) {
DataObject stockListBO = null;
DataObject stockBO = null;
ArrayList stockList = new ArrayList();
if (idNum != null) {
try {
stockListBO = boFactory.create("http://StockModule/sdo", "StockList");
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Iterator iter;
iter = session.createQuery(
"select sa.stock from StockAccount sa where sa.stockHolder.id = ?")
.setString(0, idNum).iterate();
while (iter.hasNext()) {
Stock stock = (Stock) iter.next();
stockBO = convertToStockBO(stock);
stockList.add(stockBO);
}
stockListBO.setList("stocks", stockList);
session.close();
} catch (Exception e) {
e.printStackTrace();
stockListBO = null;
}
}
return stockListBO;
}
-boFactory是com.ibm.websphere.bo.BOFactory的一个实例,在StockServiceImpl的initialize方法中进行实例化, BOFactory是Business Object的实例化工厂,用来创建BO的实例。
7.模块测试
完成StockService的实现后,使用WID提供的Module Test工具对模块进行测试。在Assembly Diagram中,点击StockService 模块右键菜单中的"Test Component",即可打开如图-19所示的模块测试界面,然后选择对应的操作并填写request入参,再点"continue"按钮运行测试。图-20显示了测试结果。
图-19:选择被测试方法并且填写request参数

图-20:测试结果

五、总结
本文结合示例详细探讨了使用Hibernate构建SCA Module持久层的方法,并且在创建示例的过程中,使用了基于模型驱动的设计方法构建SCA Module和Java实现。
本文在使用Hibernate构建SCA Module的持久层时,结合示例探讨了处理O/R映射的各种情况的方法,包括如何正确定义id的 generator,如何定义many-to-one映射关系,如何定义composite-id,如何使用数据库内置的sequence和identity属性等。
在用Java对象实现SCA Module时,使用Hibernate构建SCA的持久层可以解耦SCA Module的Java实现和DBMS类型间的关系:通过修改配置 Hibernate的配置文件(hibernate.cfg.xml),即可与不同类型的数据库进行交互,而不用修改Java代码,这一特性可以使得 SCA Module的松耦合特性进一步加强。