使用PowerDesigner的物理模型生成不同的数据库和转换成OOM模型生成CS实体类代码
转:http://blog.csdn.net/huwei2003/article/details/6123065 第 五 使用PowerDesigner的物理模型生成不同的数据库和转换成OOM模型生成CS实体类代码
5.使用PowerDesigner的物理模型生成不同的数据库和转换成OOM模型生成CS实体类代码
PowerDesigner的物理模型保存的文件是用XML来描述模型结构的格式,所以它不会受任何数据库类型的影响。假如我们刚开始的例子是使用sql2000数据库创建的物理模型,那么现在使用PowerDesigner能马上生成一份Oracle、DB2、Mysql或Access数据库的创建脚本。选择Database工具栏中的Change Current DBMS菜单,将以前的Microsoft SQL Server 2000改为MySQL 5.0,以前sql2000数据库的模型摇身一变成了MySQL,在Preview选项卡里面我们就能看到MySql的drop table if exists的sql语法了 ,这里需要注意的是转换过程中可能会出现一些错误,可能是因为你在模型里使用了某种数据库特有的一些语法或功能,在新选择数据库内不能被支持使用,所以建议从一开始就使用规范的一些SQL语法建立数据库为后面有可能移植转换做考虑,之前还提到了使用Domian自定义类型,这里就能很好的应用,如修改当前时间的自定义类型的默认值为CURDATE()即可修改所有引用字段以支持MySql数据库,或修改autoId自定义类型为其他非int类型为表的主键等等。
PowerDesigner里面各种模型是能实现无缝隙进行相互转换的。还是以刚开始会员为例子,我现在建好了物理模型需要转换为OOM模型,并把数据库所有表映射生成cs代码实体类。点击Tools工具栏选择Generate Object-Oriented Model菜单,选择生成OOM对象的语言,这里以C# 2.0为例,如果物理模型表里的Name为中文转换生成的OOM类对象字段里面也全是中文的话,请确保在转换时OOM Generation Options里的Detail选项卡内的Convert names to into codes没有被选中。转换成功后我们可以在OOM里面看到会员对象的一些关系和生成cs代码如下图:
从图片可以看出,会员与会员类型是1对1关系,而会员类型可以对应多个会员。所以生成的cs代码里会员表没有会员类型编号字段,而有一个FA_MemberType类型的属性,代表当前会员的会员类型,而会员类型表里面会多一个System.Collections.Generic.List<FA_Member>属性,代表当前会员类型的所有会员列表集合,PowerDesigner把这些面向对象的思想真的表现得淋漓尽致。但有时候我们需要的实体类是数据库内原分不动的字段映射过来,而不需要FA_MemberType类型的属性只要一个包含memberTypeId字段的完整会员表实体怎么办?我这里介绍一个简单的办法,在物理模型转换为OOM对象模型前先把表之间的所有References主外键关系全部删除掉,可能删除表的主外键关系时会PowerDesigner也会把主从表的主外键列也全部删除去,设置Tools工具栏Model Options里Reference选项里的Auto-migrate columns勾去掉即可。删除后不保存之前的物理模型直接转换成OOM后再Ctrl+Z恢复之前删除的References,这时可以看到OOM模型里面的会员类对象便是数据库会员表所有字段原分不变的映射。另外,OOM模型可以直接生成VS的工程文件带所有cs实体类文件,那么,我们使用PowerDesigner建立好数据库的物理模型后,又可转换成OOM对象模型轻松生成cs代码实体类。
可能有些朋友的PowerDesigner打开工程Preview里看到的不是我这样的cs代码,而是一些public int MemberId之类的字段,这是因为PowerDesigner将物理模型转换到OOM对象模型的时候表的所有字段是被变成类模型里面的Attributes,而Attributes配置生成的模板默认是不带有get和set访问器的,修改Language工具栏Edit Current Object Language菜单找到Profile > Attribute > Templates > definition修改模板即可。我的C#2.0模板如下:
if
(
%
isGenerated
%
) and (
%
isValidAttribute
%
)
[
%
comment
%
/n]/
[
%
oidDocTag
%
/n]/
[
%
customAttributes
%
/n]/
.
if
(
%
Multiple
%
==
false
) and (
%
isIndexer
%
==
false
)
private [
%
flags
%
]
%
dataType
%
%
fieldCode
%
[
=
%
InitialValue
%
];
[
%
visibility
%
][
%
flags
%
]
%
dataType
%
.convert_name(
%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
{
get {
return
%
fieldCode
%
; }
set {
%
fieldCode
%
=
value; }
}
.
else
private [
%
flags
%
]
%
dataType
%
[
%
arraySize
%
]
%
fieldCode
%
[
=
%
InitialValue
%
];
[
%
visibility
%
][
%
flags
%
]
%
dataType
%
.convert_name(
%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
{
get {
return
%
fieldCode
%
; }
set {
%
fieldCode
%
=
value; }
}
.endif
.endif
Java 5.0带get和set访问规则Bean对象生成模板如下:
if
(
%
Multiple
%
)
[
%
javaDocComment
%
/n]/
private [
%
flags
%
]
%
dataType
%
/[/]
%
fieldCode
%
[
=
%
initialValue
%
];
%
visibility
%
%
flags
%
%
dataType
%
/[/] get
.convert_name(
%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
()
{
return
this
.
%
fieldCode
%
;
}
%
visibility
%
%
flags
%
%
dataType
%
/[/] set
.convert_name(
%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
(
%
dataType
%
%
fieldCode
%
)
{
this
.
%
fieldCode
%
=
%
fieldCode
%
;
}
.
else
[
%
javaDocComment
%
/n]/
private [
%
flags
%
]
%
dataType
%
%
fieldCode
%
[
=
%
initialValue
%
];
%
visibility
%
%
dataType
%
get
.convert_name(
%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
()
{
return
this
.
%
fieldCode
%
;
}
%
visibility
%
void
set
.convert_name(
%
fieldCode
%
,,
"
_
"
,FirstUpperChar)
(
%
dataType
%
%
fieldCode
%
)
{
this
.
%
fieldCode
%
=
%
fieldCode
%
;
}
.endif
PowerDesigner几乎所有模型转换生成都可以使用模板来配置,这样能充分的让用户自定义来实现想要的功能。
PowerDesigner的OOM功能远远不只这一些,最重要的是使用UML建用例图了,在面向对象里面的继承、多态,面向接口编程,对象之间的依赖、包含等关系也能在这里一一体现,不同的箭头线条各自代表着不同的意思,也能够生成一些cs伪代码,由于本文主要将PDM物理模型,这里就不再赘述。不知那些大师也会不会使用PowerDesigner或Rose来画画图呢?