[转载]如何在 WebSphere Studio 中保留引用的同时将数据库表的更改导入到 EJB 模块中...

如何在 WebSphere Studio 中保留引用的同时将数据库表的更改导入到 EJB 模块中


本文探索了如何在 Application Developer 中将更改从数据库传播回 EJB 模块。本文还说明了一些可能在导入数据库的更改时会发生的缺陷,并描述了一项清除这些缺陷的新功能。

©Copyright International Business Machines Corporation 2003. All rights reserved.

引言

IBM® WebSphere® Studio Application Developer(以下称为 Application Developer)使您能够通过几种不同的映射技术(包括自顶向下映射、自底向上映射以及中间会合映射)将容器管理的实体 bean 映射到关系数据库。不管您使用的是哪种方法,最后您都要将容器管理的实体 bean 映射到数据库表。在开发过程中,数据库管理员(DBA)往往需要更新表定义,您需要将这些更改导入到 EJB 模块中。本文探讨了如何在 Application Developer 中将更改从数据库传播回 EJB 模块。本文还说明了一些在导入数据库的更改时可能会出现的缺陷,并描述了一个清除这些缺陷的新功能部件。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


建立一个简单的 EJB 项目

说 明该问题及其解决方案的最好办法是使用一个简单的示例,如果使用较大的示例会使问题变得更复杂。请不要在这个示例中使用您现有的 EJB 项目,因为那样您会发现毁坏文件是多么容易,并且此时这些文件只能手工修复。如果您已经明白了如何将数据库表的更改导入到 EJB 模块中,并且您只想学习如何修正这些缺陷,那么请参阅下面的 避免无效引用

让我们从创建一个 EJB 项目开始:

  1. 从 J2EE 透视图的菜单栏选择 File => New => EJB Project以启动 EJB 项目向导。
  2. 选择 Create 2.0 EJB Project并单击 Next
  3. 为 Project name 输入 SimpleEJB ,并为 Enterprise application project name 输入 SimpleEAR 。
  4. 单击 Finish

有了这个新建的 EJB 项目,您就想通过执行自底向上映射来创建并映射一些容器管理的实体 bean。在做这项工作之前,您将需要创建一个定义本示例中所用表的简单表 DDL,并将其导出到数据库:

  1. 在 EJB 项目中的任意一个地方创建一个新的简单文件:选择 New => Simple => File并将其命名为 Table.ddl 。
  2. 请将下列内容粘贴到这个文件中:
    CREATE SCHEMA SIMPLE;
    CREATE TABLE SIMPLE.PERSON
    (SSN VARCHAR(250) NOT NULL,
    NAME VARCHAR(250),
    ADDRESS VARCHAR(250),
    PHONE VARCHAR(250));
    ALTER TABLE SIMPLE.PERSON
    ADD CONSTRAINT PK_PERSON PRIMARY KEY (SSN);

  3. 保存这个文件。
  4. 从 J2EE Navigator 选择这个新文件并选择 Run on Database Server...以打开 Run Script向导。
  5. 输入必要的连接信息或使用现有的连接,然后单击 Finish以执行这个脚本。

既然已经将表导出到了数据库中,那么现在您就可以创建自底向上映射了:

  1. 从 J2EE Hierarchy 视图右键单击 SimpleEJB 模块并选择 Generate => EJB to RDB Mapping。EJB-to-RDB Mapping 向导打开,缺省选择 Create a new backend folder,因为这个模块没有当前后端。单击 Next
  2. 在这个向导的第二张页面上可以只选择 Bottom up选项,因为这个模块中没有定义容器管理的实体。单击 Next
  3. 在第三张页面上,输入将被用来连接到您的数据库的必需的连接信息(或者使用现有的连接亦可)。单击 Next
  4. 在下面所示的第四张页面中,有一个树形视图,它包含所有的数据库模式以及您的数据库中定义的这些模式的表。选择表 SIMPLE.PERSON并单击 Finish

bottomUp4.jpg

EJB 模块现在包含一个容器管理的实体 Person,它被映射到刚刚导入的表 PERSON。请注意您刚刚导入的文件的位置。这些文件被导入到新建的后端文件夹 DB2UDBNT_V72_1 中,如下图所示。EJB 2.0 模块的所有数据库定义都是在一个特定的后端文件夹中定义的(EJB 1.1 模块只有一个数据库定义,定义在 META-INF/Schema 目录下)。这些文件都通过一些超级链接互相关联在一起,这些超级链接使用一个 ID 指向另一个文档中的特定对象。这些 ID 是由系统生成以确保唯一性的。更仔细地看一下这些引用将会帮助您理解这些文档是如何互相关联的。


backendfolder.jpg

blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


理解数据库文档引用

首先,我们看一下 Con1_SAMPLE_SIMPLE_PERONS.tblxmi 文档的一段摘录(如果您输入的是另一个连接名称, Con1 可能会有所不同)。蓝色的 ID 针对的是该文档中定义的表,红色部分是对 SAMPLE.dbxmi 文档中数据库的引用。

        xmlns:RDBSchema="RDBSchema.xmi" xmi:id="

RDBTable_1050981749525"
name="PERSON" primaryKey="SQLReference_1050981749525">






现在请看一下 SAMPLE.dbxmi 。蓝色部分是与上面超级链接的 RDBDatabase ID 相匹配的数据库 ID。红色部分是对上面的 RDBTable 的引用。这个引用是指向被引用文档中的相应 ID 的指针,这个 ID 是镑(#)符号后面的全部内容。

        xmlns:RDBSchema="RDBSchema.xmi" xmlns:RLogic="RLogic.xmi"
xmi:id="

RDBDatabase_1050981748023" name="SAMPLE">


href="

META-INF/backends/DB2UDBNT_V72_1/Con1_SAMPLE_SIMPLE_PERSON.tblxmi#RDBTable_1050981749525"/>






这些引用和 ID 必须保持同步以便文件能够正确装入。Map.mapxmi 将与数据库文档遵循相同的引用规则。下面 Map.mapxmi 文件的一段摘录(除去了 commandStack 值)表明这个文件还有基于数据库文档中 ID 的引用,这些引用和 ID 必须同步以便正确装入映射。它包含对数据库、对表和对列的引用,如下面红色突出显示部分所示。数据库文件间关系的概述将会帮助您理解把更改导入到 PERSON 表时出现的问题。正常情况下,您不必检查这些文本格式的文件,但准确显示它们之间的关系还是会有所帮助的。

         xmlns:ejbrdbmapping="ejbrdbmapping.xmi" xmlns:RDBSchema="RDBSchema.xmi" xmlns:ejb="ejb.xmi"
xmlns:Mapping="Mapping.xmi" xmi:id="EjbRdbDocumentRoot_1050981754162"
outputReadOnly="false" topToBottom="false">
primitivesDocument="DB2UDBNT_V72"/>





href="

META-INF/backends/DB2UDBNT_V72_1/Con1_SAMPLE_SIMPLE_PERSON.tblxmi#RDBColumn_1050981749525"/>


...
href="

META-INF/backends/DB2UDBNT_V72_1/SAMPLE.dbxmi#RDBDatabase_1050981748023"/>

href="JavatoDB2UDBNT_V72TypeMaps.xmi#Java_to_DB2UDBNT_V72_TypeMaps"/>





blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


导入数据库表的更改

现在我们看一下将数据库表的更改导入到 EJB 项目中需要些什么。下面是一个更新过的表 DDL,我们应当使用上述 Run on Database Server操 作(这个操作将模拟 DBA 对数据库进行更改)将它导入数据库中。现在您要将这些对表的更改导入到 EJB 模块中。如果知道需要做哪些具体的更改,只需使用 Application Developer 中的表编辑器来更新表即可。实际上,您可能不知道已经做了哪些具体的更改,所以需要将表导入,以使最新的更改生效。下面的步骤对于将表导入一个现有的 EJB 项目来说是正确的,但是如果不实现 避免无效引用这一部分的解决方案,数据库文档可能会被毁坏。所以,目前我们只对这里描述的样本 EJB 项目或另一个已经存在的一次性 EJB 项目执行这个操作。

DROP TABLE SIMPLE.PERSON;
CREATE TABLE SIMPLE.PERSON
(SSN VARCHAR(250) NOT NULL,
NAME VARCHAR(250),
ADDRESS VARCHAR(250),
PHONE VARCHAR(250),
AGE INTEGER);
ALTER TABLE SIMPLE.PERSON
ADD CONSTRAINT PK_PERSON PRIMARY KEY (SSN);

要将一个或多个数据库表导回 EJB 模块现有的后端文件夹,最容易的方法是使用 J2EE 透视图中的 DB Servers 视图,如下所示:


dbservers.jpg

您可以从这个视图选择一个连接,并根据这个连接当前处于连接状态还是断开状态选择 RefreshReconnect上下文菜单。这样可以确保 DB Servers 视图将显示数据库中当前的更改。接下来,沿目录展开到表 PERSON,右键单击并选择 Import to Folder,如下所示。这个操作启动了一个将选中的对象导入到特定的文件夹中的向导。


importToFolderAction.jpg

在这里,事情变得有点棘手。所启动的向导(如下所示)有一个 Folder 域,它允许您转到要将文件导入的文件夹。缺省状态下选择的 Use default schema folder for EJB project选项允许您在使用 Browse按 钮搜索文件夹时选择一个 EJB 项目,并且它还将自动选择这个 EJB 项目中合适的后端文件夹。如果您正在将一些表导入到一个没有定义数据库表的新 EJB 项目中,这样就很好,但是如果您已经为 EJB 项目定义了一个后端,那么就会有一个新的后端文件夹被创建。即使您转到现有的后端文件夹 ...backends/DB2UDBNT_V72_1 ,被选择的文件夹也会更改为 ...backends/DB2UDBNT_V72_2 ,后者并不是您选择的现有文件夹。出现这种情况是因为选中了 Use default schema folder for EJB project 复选框。这个选项会为 EJB 项目自动选择一个有效的空后端文件夹。因此,要导入现有的后端文件夹,需要清除这个复选框选项。现在您可以选择当前后端文件夹了,如下所示:


importToFolderWiz.jpg

单击 Finish后,您将会被提示覆盖 PERSON 表文件。单击 Yes以创建一个新的表文件。下面是这个新文件的一段简短摘录。虽然它与前面的 PERSON 表文件相似,但是 RDBTable 的 ID 已经更改了,而对数据库和模式的引用却没变(请参考前面的表文件摘录)。 SAMPLE.dbxmi 文件和模式文件也已被更新,以指向这个新的表 ID。如果您当时使用的是小组资源库并且没有检入数据库文件和模式文件,而是检入了已更新的表文件,那么被检入的数据库文件和模式文件将指向一个不存在的 表对象。这基本上就可以导致数据库文件集被毁坏或不正确,并导致 Application Developer 中出现问题。

        xmi:id="

RDBTable_1051063196380" name="PERSON" primaryKey="SQLReference_1051063196380">





既然您明白了导入现有数据库表时的问题,那么就可以避免导致这些文件被毁坏的情况。但是,您将无法避免这样的事实: Map.mapxmi 文件仍在引用已被修改的旧的表 ID。因此,如果打开 EJB to RDB Mapping 编辑器,那么所有已创建的映射都会被映射编辑器除去,因为这些映射不再有效(原因是对现在不存在的表 ID 进行了引用)。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


避免无效引用

既 然知道了如何将数据库表导入现有的后端文件夹,您可能就会问自己如何避开这些问题。解决方案是根据元素的名称更改数据库文件中的 ID 而不使用系统生成的 ID。如果切换到基于名称的 ID,只要表及其列的名称在数据库中没有改变, 在导入时您就会获得它们原来的 ID。如果这些名称改变了,那么实际上它便是另一个对象了,ID 也应不同。您可以 从下面下载一个新功能部件,它可以使这个解决方案成为可能。

在使用这个新功能部件之前,请删除并重新创建 SimpleEJB 项目并对 PERSON 表进行自底向上映射,如同上面一样。这样将使您第二次回到导入数据库表之前的状态(不考虑表已在数据库中被修改这个事实)。这正好发生在文件被毁坏之前。

可下载的 data.ids.feature.zip 文件包含一个新功能部件,您可以将其应用到 Application Developer V5.0 或 V5.0.1 中。安装这个功能部件的步骤为:

  1. 将 data.ids.feature.zip 解压缩到 Application Developer 的安装目录。
  2. 启动 Application Developer。
  3. 一个对话框打开,指出您有尚未执行的更改。单击 Yes以继续进行安装。
  4. 选择 Data Tools ID Feature以进行安装并单击 Finish
  5. 选择 Yes以重新启动,从而更改生效。

在将数据库表的更改导入 EJB 项目的现有后端文件夹之前,您首先要迁移所有数据库文件和 Map.mapxmi 文件的 ID 和引用。为此,请右键单击 J2EE Navigator 中的 SimpleEJB 项目,然后选择 Migrate Database IDs。您可以选择多个 EJB 项目,并迁移每个 EJB 项目中的每个后端文件夹。下面是来自我们的简单示例的已迁移数据库表文件的一段摘录。蓝色的 ID 与名称相同,红色的引用使用其他文档中的基于新名称的 ID。

        xmi:id="

PERSON" name="PERSON" primaryKey="PK_PERSON">



xmi:id="SQLCharacterStringType_1051066499780" characterSet="800" length="250">
href="DB2UDBNT_V72_Primitives.xmi#SQLCharacterStringType_3"/>





为 EJB 项目迁移过数据库 ID 后,您就可以导入表更改了,无需担心丢失映射文件或其他数据库文件的引用。现有的 EJB 项目只需要进行一次导入操作。所有的新数据库文件现在都将使用基于新名称的 ID。另外,这个功能部件还会转换对于 XML ID 无效的名称中的字符,以便文档可以被解析。这种转换每次都使用相同的算法,因此,ID 每次都可以重新创建。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


结束语

您 已经学习了如何将数据库表的更改导入到 EJB 项目的一个现有的后端文件夹。但是您也了解到了数据库文档间的引用以及映射文件可能会被毁坏,这样会导致 Application Developer 中出现问题,并要求您每次将更改从数据库导入到 EJB 项目时都要花时间映射数据库表。Application Developer 的一个新功能部件可以通过切换数据库文档以使用基于名称的 ID 来消除这些问题,这样在第一次导入数据库表之后再次导入时还会使用原来的 ID。映射文件中的引用保持有效,避免了数据库文档被毁坏。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-130617/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-130617/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值