Product映射:
现在我们要开始讲解从Product类到数据库表PRODUCT的映射。通常这种映射都不是通过
编程实现,而是通过定义一个xml文件。DescriptorRepository类提供了一些方法来读取
xml文件并进行初始化。结果就能在以后的编程中被使用(也可以通过纯编程来实现)。
我们已经写好了我们的映射关系,文件放置在src/test/ojb/repository.xml,中,xml
文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!-- This is a sample metadata repository for the ObJectBridge System.
Use this file as a template for building your own mappings-->
<!-- defining entities for include-files -->
<!DOCTYPE descriptor-repository SYSTEM "repository.dtd" [
<!ENTITY user SYSTEM "repository_user.xml">
<!ENTITY junit SYSTEM "repository_junit.xml">
<!ENTITY internal SYSTEM "repository_internal.xml">
]>
<descriptor-repository version="0.9.1"
isolation-level="read-uncommitted">
<!-- The Default JDBC Connection. If a class-descriptor does not
specify its own JDBC Connection,
the Connection specified here will be used. -->
<jdbc-connection-descriptor
platform="Hsqldb"
jdbc-level="2.0"
driver="org.hsqldb.jdbcDriver"
protocol="jdbc"
subprotocol="hsqldb"
dbalias="/samples/hsql/OJB"
username="sa"
password=""
/>
<!-- include user defined mappings here -->
&user;
<!-- include mappings for JUnit tests and sample apps here -->
&junit;
<!-- include ojb internal mappings here -->
&internal;
</descriptor-repository>
文件含有很多的信息:
1. Xml文件通过repository.dtd来验证其有效性。这就保证的xml文件语法的正确性。
确保将dtd文件放在和xml文件一样的目录,否则xml解析器将会报出找不到DTD的错误
2. 映射包含一个缺省的JDBCConnectDescriptor。该描述包含了在存储操作中所用到的
JDBC连接。对于那些没有定义特殊的JDBCConnectionDescriptor的类来说,都使用该描
述中的缺省JDBC连接。
在我们的例子中,描述申明了所有的操作都是靠JsqlDb JDBC驱动的,相应的数据库放在
相应的目录下面。
3. OJB映射回归测试。通过包含repository_junit.xml中的XML entity&junit。该ent
ity被定义在一个包含的文件中:
<!ENTITY junit SYSTEM "repository_junit.xml">
4. OJB内部的映射。OJB需要一些内部表来进行一次阿操作,如维持数据库锁,自动增
长,ODMG的collections和Maps。相应的映射也在这里实现。他们都正确的操作起重要作
用,应该不能被修改。
这些内部映射通过包含repository_internal.xml中的XML entity&internal来定义
5. 用户定义的映射。用户定义的映射包含所有对存储类做的对象/关系映射信息。缺省
的,实例程序的映射在这里定义。这些映射通过包含repository_user.xml的XML entit
y&user来定义。
现在让我们来看一下Product类,我把相应的映射放在repository_user.xml中,这样我们很
容
易找到。从文件的开头我们可以看到有一个对Product类的类描述:
<!-- Definitions for org.apache.ojb.broker.Product -->
<class-descriptor
class="org.apache.ojb.broker.Product"
table="PRODUCT"
>
<field-descriptor
name="id"
column="ID"
jdbc-type="INTEGER"
primarykey="true"
autoincrement="true"
/>
<field-descriptor
name="name"
column="NAME"
jdbc-type="VARCHAR"
/>
<field-descriptor
name="price"
column="PRICE"
jdbc-type="DOUBLE"
/>
<field-descriptor
name="stock"
column="STOCK"
jdbc-type="INTEGER"
/>
</class-descriptor>
类描述给出了和RDBMS表相映射的类名称。
对于每个存储类的属性,我们定义一个field-descriptor,对应存储在数据库中的每一
列.对于主键,我们有一个特别的标记:primarykey="true".主键也相应地被设为autoi
ncrement="true",这就告诉了OJB给这个属性分配一个唯一的ID。这些都是通过一个Se
quenceManager工具类实现的。
Field-descriptor既可以声明primitive data型,也可以声明相应的封装类。
如果你的存储类中含有其他存储类的实例,你可以通过reference-descriptor来定义它
们之间的关系。如果存储类中有array-或是collection-属性,你可以使用collection-
descriptor属性。你可以在org.apache.ojb.broker包中找到一些例子,相应的描述在r
epository.xml中。
工具支持:
一般说来,有三种建立O/R映射的方式:
1. Forward engineering。通过给出Java类(或是UML模型),生成SQL DDL和映射关系
。我们可以使用一个工具从repository.xml生成一个数据库。执行build[.sh] forword
-db可以看到forward engineering的工作过程。
2. Reverse engineering。给出SQL DDL或者数据库,产生Java类和映射。执行build[
.sh] reverse-db可以看到reverse engineering的工作过程。
3. Mapping proper。给出Java类和SQL DDL,产生映射。我们现在还没有进行果测试,
但是已经列入下一步的计划中。
结论:
在本文中,我们学习了怎样给一个简单的类建立OJB对象/关系映射,在类的实例上通过
OJB PersistenceBroker API进行存储操作。
接着还有三篇文档,介绍了如何使用OJB ODMG API,OJB JDO API和高级O/R映射(包括
1-1,1-n映射,代理机制,支持多态性和映射继承)
我们希望该文档会对你有帮助,欢迎提出意见建议。