配置数据库连接信息
将StockModule发布到WID中的Websphere Process Server v6.0,然后在管理控制台增加名称为jdbc/localdb的JNDI配置,并保证测试连接成功:
Step1: 设置DB2_JDBC_DRIVER_PATH,指定DB2 JDBC驱动的位置
例如:C:\Program Files\IBM\SQLLIB\java
Step2: 新建J2C认证信息
在Security -> Global security -> JAAS Configuration -> J2C Authentication data中,新增J2C认证信息,这里的用户名和密码是为登录数据用的。
图-15:新增J2C认证数据

Step3: 新增JDBC Providers:DB2 Legacy CLI-based Type 2 JDBC Driver
选择Resources -> JDBC Providers 菜单,点击New按钮:
图-16:新增JDBC Providers

保存之后,在其Data Sources属性中,新增jndi_localdb的JNDI配置:
图-17:新增jndi_localdb的JNDI配置

在module.stock.implementation目录中创建hibernate.cfg.xml并进行配置
主要配置以下几项:
hibernate.connection.datasource:jdbc/localdb(JNDI名称)
connection.pool_size:1
dialect:org.hibernate.dialect.DB2Dialect
show_sql:true(将Hibernate生成的SQL语句以SystemOut的方式输出到日志中)
mapping resource:引入Hibernate映射文件
配置完毕的hibernate.cfg.xml文件如下表:
清单-3:hibernate.cfg.xml文件内容
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings, we use jndi here -->
<property name="hibernate.connection.datasource">
jdbc/localdb</property>
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">
org.hibernate.dialect.DB2Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">
thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">
org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<mapping resource=
"/gen/src/module/stock/implementation/Stock.hbm.xml"/>
<mapping resource=
"/gen/src/module/stock/implementation/StockType.hbm.xml"/>
<mapping resource=
"/gen/src/module/stock/implementation/StockAccount.hbm.xml"/>
<mapping resource=
"/gen/src/module/stock/implementation/StockHolder.hbm.xml"/>
<mapping resource=
"/gen/src/module/stock/implementation/StockMemo.hbm.xml"/>
</session-factory>
</hibernate-configuration>
该文件将在实例化SessionFactory的时候被引用,Hibernate将根据此文件创建数据库连接池,并根据其中的mapping 定义建立*.hbm.xml与JavaBean之间的映射关系。有关SessionFactory,请参考实现StockService模块一节的内容。
3.连接到sample数据库并创建所需数据表
在本文所附的StockModule.rar中,在StockModule\gen\src\module\stock\implementation路径下包含一个名为 create_db_objects.sql的文件,运行db2cmd并连接到sample数据库上,
db2 connect to sample
然后使用下列命令提交create_db_objects.sql文件来创建所需的表:
db2 –td; -f create_db_objects.sql
项目中还有一个init_db_objects.sql文件来向所创建的表中插入一些测试数据,请执行下列命令:
db2 –td; -f init_db_objects.sql
4.创建Java类
在创建图-2所示的类图的同时,我们已经创建了下列JavaBean:
module.stock.implementation.StockType
module.stock.implementation.StockMemo
module.stock.implementation.StockHolder
module.stock.implementation.StockAccount
module.stock.implementation.Stock
使用WebSphere Integration Developer,程序员能够以模型驱动的方式在建模的过程中创建类图和对应的Java类。
5.创建Hibernate映射文件
Hibernate映射文件定义的是数据库表的字段和JavaBean的属性之间的映射关系,这种映射关系除了一般字段与字段的直接对应关系外,还包括表与表之间的多对一,一对多,多队多的对应关系。Hibernate将根据这些映射文件,自动生成SQL语句,并把从数据库中取得的对象填充到JavaBean的简单属性或复杂属性中。
这一节中,我们将介绍如何为本例中的各个JavaBean构造Hibernate映射文件,并将揭示以下技巧:
如何映射id主键以及id值的生成方法
如何使用数据库提供的sequence对象生成id
如何映射多对一关系
如何定义组合主键映射
创建StockType.hbm.xml – 最一般的情形
StockType是最简单的JavaBean,没有复杂的映射关系,StockType.hbm.xml定义StockType这个JavaBean和数据库表StockType之间的映射关系:
清单-4:stockType表定义
CREATE TABLE stockType(
id VARCHAR(10) NOT NULL,
typeName VARCHAR(20),
CONSTRAINT pk_stockType PRIMARY KEY(id)
);
清单-5:StockType类定义
package module.stock.implementation;
import java.io.Serializable;
public class StockType implements Serializable {
private String id;
private String typeName;
//Getters and setters…
… …
}
清单-6:StockType.hbm.xml定义
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="module.stock.implementation">
<class name="StockType" table="StockType"
lazy="true">
<comment>Stock Type table</comment>
<id name="id">
<generator class="assigned" />
</id>
<property name="typeName"/>
</class>
</hibernate-mapping>
- package: 指明 class name=”StockType”所代表的JavaBean的package路径。
- table: 指明与StockType JavaBean建立映射关系的表名。
- comment: 对此映射文件的注释
- id: 主健定义,必须唯一,如果StockType表中的字段名不是id,则需要用column=”idName”来说明,例如:<id name="id" column="idName">
- generator: 指定主键值的产生算法,assigned为用户指定。可供选择的还有: sequence(使用数据库提供的sequence对象,Oracle, DB2等数据库支持,本例将用到sequence), increment, identity, hilo, seqhilo, uuid, guid, native,select foreign等,关于这些id生成算法的具体情况,请参考Hibernate reference documentation。
- property:指定JavaBean属性与数据表字段之间的映射,如果列名与JavaBean属性名不相同,则需要增加column=”” 来说明。如<property name="typeName" column="name"/>。
创建Stock.hbm.xml – 定义多对一关系
Stock(证券)类有一个stkType属性,类型为StockType(证券类别),一个证券类别可以有多个证券,多个证券可能属于同一个证券类别,所以它们之间的关系是多(Stock)对一(StockType)的关系,我们使用many-to-one来定义这种关系。其他字段直接映射即可。
清单-7:stock表定义
CREATE TABLE stock(
id VARCHAR(10) NOT NULL,
stkName VARCHAR(40),
stkTypeId VARCHAR(10),
CONSTRAINT pk_stock PRIMARY KEY (id)
);
清单-8:Stock类定义-6:StockType.hbm.xml定义
package module.stock.implementation;
import java.io.Serializable;
public class Stock implements Serializable {
private String id;
private String stkName;
private String stkTypeId;
private StockType stkType;
//Getters and setters
……
}
清单-9:Stock.hbm.xml定义
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="module.stock.implementation">
<class name="Stock" table="Stock" lazy="true">
<comment>Stock table</comment>
<id name="id">
<generator class="assigned" />
</id>
<property name="stkName"/>
<property name="stkTypeId" />
<many-to-one name="stkType" class="StockType"
insert="false" update="false">
<column name="stkTypeId"/>
</many-to-one>
</class>
</hibernate-mapping>
-many-to-one:定义stkType属性与StockType类之间的多对一关系。Name为Stock类的stkType属性,class指定该属性的类型, <column>指定在Stock表中与StockType进行连接的属性名,在本例中为stkTypeId。
创建StockHolder.hbm.xml – 使用数据库的sequence