Hibernate代码生成工具设计全攻略.docx

上传人:b****6 文档编号:9100754 上传时间:2023-02-03 格式:DOCX 页数:18 大小:1.02MB
下载 相关 举报
Hibernate代码生成工具设计全攻略.docx_第1页
第1页 / 共18页
Hibernate代码生成工具设计全攻略.docx_第2页
第2页 / 共18页
Hibernate代码生成工具设计全攻略.docx_第3页
第3页 / 共18页
Hibernate代码生成工具设计全攻略.docx_第4页
第4页 / 共18页
Hibernate代码生成工具设计全攻略.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Hibernate代码生成工具设计全攻略.docx

《Hibernate代码生成工具设计全攻略.docx》由会员分享,可在线阅读,更多相关《Hibernate代码生成工具设计全攻略.docx(18页珍藏版)》请在冰豆网上搜索。

Hibernate代码生成工具设计全攻略.docx

Hibernate代码生成工具设计全攻略

Hibernate代码生成工具设计全攻略

Sybase公司PowerDesigner上海研发中心汪晟杰

1.简述

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,提供HQL查询语言,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

使用Hibernate,必须为配置映射文件—ClassMappingFile和ConfigurationFile,现在市场上提供了诸多Hibernate代码生成工具,比如:

XDoclet,以及Hibernate官方自带的sechmaExport工具。

然而它们都有如下的缺点:

仅提供一些基本的输入模版,用户仍需要时间进行配置和修改;没有提供自动的持久类以及InvokeBean的代码生成;不支持图形界面;不支持对HibernateTestCase的代码生成。

Hibernate工具具备以下特点:

1.根据UML生成的数据库模型,自动生成映射文件。

2.根据UML产生Hibernate持久类。

3.Hibernate模型检验。

4.生成自动测试代码。

5.与Eclipse集成

Hibernate代码生成工具采用基于PowerDeigner的模型扩展功能来实现Hibernate的代码生成。

PowerDesigner(以下简称PD)是一款一流的数据库建模工具(E-R模型设计、物理模型设计),同时它对UML、报表、XML、团队开发(知识库Repository)都支持的相当好,所有模型都可以正向、逆向的相互转换。

PD的模型是由它的元模型组成。

简单的说,元模型就是组成模型的模型。

基于这些元模型,PD提供了一套GTL开发语言,可以轻易地扩展出自己的代码模版和流程,也可以对现有的语言模型进行修改以适应需求;PD支持利用VBScript来扩展语言、改变PD模型、模型检测。

对于Eclipse,PD也能做到快速的集成并可以利用JAVA语言来修改PD模型。

注:

GTL可以说是一种面向对象的脚本语言,它可以在不同的元模型上加以扩展,增加诸如:

添加生成文件、原型、菜单、代码模版、扩展属性等等功能,如图1所示,将在后续部分详细的阐述。

由于元模型是面向对象的(比如所有的类、接口等的元模型都继承于Classifier元模型),即如果在Classifier中扩展了一个功能,那么继承它的模型均拥有这样的功能和脚本,也可以覆盖重写这样的功能,以实现多态概念。

ExtendedModelDefinition,在弹出的窗口的Toolbar上选择ImportExtended打开扩展模型编辑窗口:

选择ModelModelDefinition(倒数第二个按钮)来加载已有的模型,也可以新建扩展模型(选择AddRow按钮,然后在表格中双击要编辑的模型的第一列即可弹出如图1所示的界面)

为了让读者更好的了解PD的元模型概念,截取了Hibernate代码生成工具所用到的元模型架构图,如图2所示。

读者可以在PD的安装目录下找到:

\Examples\MetaModel.oom,图表存放在PdOOM下,名字为ClassObjects。

由于篇幅原因,会摘取典型的代码和模型来讲解如何设计Hibernate代码生成工具。

Hibernate代码生成的总体架构流程(活动图)

Hibernate自动生成文件的原则是:

1)子类的映射信息挂在根类的映射文件下(RootClass),即子类将不独立生成代码

2)Value-Type类以及没有持久化的类,将不生成代码。

3)不为非类对象生成代码(比如接口等)

其中:

CheckModelsinDiagram:

Hibernate模型检测,判断DomainModel是否符合Hibernate语法。

如果出错,PD将抛出错误提示信息(提供自动纠错的功能)

GenerateConfigurationFile:

选择模型属性(Model->ModelProperties),用户可以在ExtendedAttribute下设置配置信息,PD会根据配置信息生成ConfigurationFile。

GeteachclassinDiagram:

这是PD的机制,它会自动获取UML内的所有模型元素,并根据每个模型的扩展属性(Profile\GeneratedFile)的流程来生成代码文件。

GenerateBasicMapping:

类的基本映射,它包含id,composite-id,propery等。

GetSubClassStyle:

子类的映射,递归获取。

GenerateJoin:

当持久类对应于多张表的映射时,需要用Join来指明。

GenerateAssociationMapping:

根据类之间Association的类型来判断是哪种关连映射,本工具支持one-to-one,one-to-many,many-to-one,many-to-many(根据AssociationProperties的Detail标签下的Multiplicity来设置),支持集合Array,Set,List,bag,idbag(根据ContainType来设置)。

GetJavaCodeInformation:

扩展模型是基于现有的语言模型,即扩展模型能够获取语言模型的模版和各种设置,对于Hibernate的Java持久类,我们只须在Java代码下增加对应Attribute的Getter和Setter即可。

%source%

GenerateInvokeBean:

生成Hibernate的CRUD函数。

GenerateTestCase:

Hibernate测试用例代码,将生成的随机数据来验证Hibernate的正确性。

GenerateLog4J:

生成Log4J的配置文件

GenerateANTbuild.xml:

当用户在GenerationFiles下的Options中设置Ant为True,并配置了Ant的Lib的路径,则HibernateTools会生成build.xml,然后将会自动运行Ant来测试Hibernate,生成结果将会被Log4J存入日志。

2.技术要点

O/RMapping

PD从8.0开始,就不断加强O/RMapping,除了代码模型的生成以外,PD也生成O/RMapping的定义,诸如生成EJBCMP组件。

用户可以定义O/RMapping来建立OOM与PDM之间的关系。

PD支持3种方式的O/RMapping:

第一种是从类图转换成数据模型之后由PD自动建立连接(适用于自顶向下的设计过程);

第二种是从数据模型转换成类图之后由PD自动建立连接(适用于自下向上的设计过程);

第三种是建立类图和数据模型之后由用户手动建立(适用于同步设计或者是后期的修改)

建立过程:

第一种:

选择类图,然后设计持久类(POJO),完毕之后,选择Tools->GeneratePhysicalDataModel。

在弹出的窗口中,选择Detail标签,选中O/RMapping选项,即可。

读者可以选择是更新现有的数据库还是新建数据库。

第二种:

与第一种建立过程相似,只是换成在数据库模型中选择GenerateObject-OrientedModel

第三种:

用户必须首先建立DataSource,在左边WorkSpace树形目录下找到类文件,然后右击选择New\DataSource,在弹出的窗口的Models标签中选择,并选择想与之关联的数据库模型。

在类模型中打开类属性(双击要建立O/RMapping的类),选择Mapping选项卡,点击按钮添加刚才建立的DataSource。

然后点击添加类映射的数据表,即建立完毕。

用户可以添加多张表,它表示一个类可能对应多张表的映射,Hibernate的映射则应该用Join属性来指明。

注:

当用户建立了ClassSource,PD会根据类的属性和表的字段自动建立AttributeMapping,当然用户也可以在AttributeMapping属性页下对其映射进行修改。

大家知道,Hibernate的映射文件必须包含对表的表述(比如:

column,property属性等等),在PD中,通过元模型中的Mapping可以轻易地获取对应的表信息。

图4是GTL中用到的O/RMapping元模型。

O/RMapping架构图:

架构说明:

1)Association:

在Asoociation元模型中,可以通过Mappings来获取AssociationMapping(即用户在Mappingfor下选择的DataSource),每个AssociationMapping都会有SourceClassifiers,它是AsoociationSource标签内的映射集合,如图5所示。

SourceClassifiers集合中的元素,也就是数据模型中的Reference元模型,如图6所示。

由于PD可以在AssociationMapping下添加数据模型中的其他Reference和Table,所以在做Hibernate代码生成时,采用了类型判断,以避免因类型不匹配而造成的错误。

☺实现代码(表映射):

(注:

附录部分将介绍部分GTL语法)

.

☺实现代码(referenceColumnHelper模版):

2)Class和Attribute

获取数据库模型的方法与Association类似,在O/RMapping中,ClassMapping的SourceFeature等价于数据表;AttributeMapping的SourceFeature等价于数据表中的列信息。

图7给出了在编写过程中使用到的数据库元模型的架构图。

☺实现代码(获取类对应的表信息)

说明:

Mappings.First.ClassSources表明当前DataSource下的表集合

☺实现代码(获取Attribute对应的列信息)

例如:

%AttributeMappings.First.SourceFeature.Code%

%AttributeMappings.First.SourceFeature%对应于图7的Column元模型。

ExtendedAttribute

Hibernate生成工具中对于映射文件,难免要遇到大量的选项让用户选择或者输入,这时,我们就可以利用PD提供的ExtendedAttribute来扩展模型的属性。

对于UML模型,除了Dependency和Generalization,其余模型均有ExtendedAttribute来扩展。

设置ExtendedAttribute步骤:

进入扩展模型编辑窗口,在Profile下选择一个元模型,然后右键选择ExtendedAttribute,PD已提供了多种默认的选项(加括号的),当然用户增加自己的ExtendedAttributeType(在Profile下的shared目录上按右键选择ExtendedAttributeType,然后在右边可以设置列项内容以及默认值等等。

设置完之后读者就可以在模型的扩展属性中引用到自定义的类型),如图8所示。

在GTL中,可以用%属性名%引用到当前用户的选择值,也可以用%模版名%引用到GTL模版(读者可以选择模版并按F12跳转)。

CheckModel

考虑,由于基于UML建立的DomainModel,对于Hibernate语法来说,难免有一些语法上的错误,比如:

在两个类之间建立Association,但对应的表之间却没有Reference,或者是有Reference却没有Joins下的Column,这时我们应该给出一个错误警告,提示用户检查。

以刚才提到的AssociationCheck为例,将介绍如何实现用户自定义的Check。

打开Hibernate扩展模型,选中Profile\Association,右击选中New\CustomCheck。

在右边,读者可以看到有四个选项卡,如图9所示。

CheckScript:

用于检测模型,%Check%=true,将不出现错误信息。

AutofixScript:

用于自动修复模型错误,%Fix%=false,表示不修复该错误。

当PD监测到错误时,用户可以在错误上右键选择AutomaticCorrection即可。

对于自动修复的错误,会在图标右下角加上一个”+”号,如,表示PD以根据AutofixScript修复完成。

GlobalScript:

用于存放全局函数,在任何元模型的CheckModel均可调用。

实现代码

CheckScript:

用于检测Refence的建立正确与否。

注:

PD会对每个模型进行检测(包括Package),所以如果读者希望通过程序来控制该模型是否被检测,只须在满足条件的语法段内加上%Check%=True(表示验证正确并跳过)即可。

PersistentClass持久类

对于POJO的持久类,必须为其每个类的属性增加Getter和Setter函数。

扩展模型是基于语言模型之上的,也就是说,语言模型中的模板等内容均可在扩展模型中覆盖和重写。

所以,在Hibernate扩展模型中采用重载的方法,扩展了Java语言模型的代码生成,保留了原先Java那部分代码,并在扩展模型中加上自己的Getter和Setter模版。

在Java语言模型中,代码生成是依靠%source%模版来完成Java代码的,同时有一个%initializers%模版实现当完成Attribute之后的一些初始化工作,所以在相同位置(Class元模型)的地方重写了%initializers%模版,代码如下:

在Attribute元模型中增加getterFunction、setterFunction模版,代码如下:

然后在Class元模型中增加持久类的GeneratedFiles,并在模版编辑框内输入%source%即可。

GeneratedFiles

PD在每个元模型中提供了文件生成的功能。

在Class元模型上右键选择GeneratedFiles。

在右边窗口中,在FileName下输入生成后的文件名。

由于Hibernate映射文件的文件名与类名相同,故输入%mappingFilename%,同时建立mappingFilename模版,并输入%Code%.hbm.xml。

注:

所有的元模型都继承于NamedObject(NamedObject继承于BaseObject),在NamedObject中存放了各种元模型的标准属性,比如:

模型名称(Name)、代码名称(Code)、注释、描述等等。

所以,为了取到类的名称,就在类元模型下输入%Code%.hbm.xml,那么PD会根据代码名称为每个类建立相应的文件(前提是该类可以被生成,即已持久化)。

Model

Model元模型中主要实现对ConfigurationMapping的连接信息的配置,诸如,JDBC等。

所用到的方法也就是ExtendedAttribute和Mapping代码模版。

由于篇幅原因,不一一列举,读者可以参考刚才所讲,或者可以在PD安装目录下运行pdvbs11.chm来获取帮助。

Task

Task在代码生成完毕之后被激活,然后PD会依次序执行选中的任务。

扩展了Hibernate模型,增加了ANT的Lib路径,生成的目录名称等等选项。

在Generation\Options下建立新的选项即可,类似于ExtendedAttribute。

调用Options选项时,输入如下代码:

%GenOptions.选项名%即可获取。

对于Task,希望能够借助ANT的build.xml配置进行自动测试。

在PD中,JAVA语言模型已经提供了ANT的build.xml的自动生成并预留接口(customExecuteTarget、customerProperties、customTaskDefs三个模版)EditCurrentObject,目的为了能让扩展模型来重载,有兴趣的读者可以查看Java语言模型(LanguageLanguage,浏览Java:

:

Profile\Model\Templates\Ant\antTemplate)。

建立Task:

在Generation\Tasks上右键,选择New。

输入TaskName(就是真正执行的显示名),取名为RunUnitTest。

在下面的表格中选择已建立的Command,如果没有建立,则可以在Commands上新建。

RunUnitTestCommand代码:

说明:

.execute_command为宏命令,用于执行外部的程序。

.execute_command'('[','[',']]')'

第一个参数为主命令,这里是CMD

第二个参数为主命令的参数,这里是/KANT.BATJUNIT

第二个参数为管道类型,PD提供cmd_ShellExecute和cmd_PipeOutput两种方式。

前者采用独立的进程方式,后者将会阻塞PD直到任务完成,并且结果将显示在PD的Output窗口内,如图10所示。

3.结束语

PowerDesigner是一款灵活性非常强的软件建模工具,基于它的元模型,读者可以随心所欲的用不同语言(GTL,VBScript,Java,C#等)来设计出自己的代码生成工具,甚至是语言模型、报表等等。

本篇仅仅起到了一个抛砖引玉的作用,我相信,凭借着领域中的经验,读者一定也可以设计出更适合自己的代码生成工具,简化流程、降低成本、加快开发。

附录:

列举了GTL的部分语法,读者也可以参阅PD安装目录下的pdvbs11.chm文件或者Sybase官方网站。

1.资源文件

读者可以参考PD11的现有模型:

您可以在安装目录下\ResourceFiles\ExtendedModelDefinitions找到现有的扩展模型;在安装目录下\VBScripts找到VBScript代码;OleAutomation目录下找到如何用JAVA,C#等其他语言来获取元模型来做自己的代码生成工具;Library目录下找到语言模型。

在PrintableDocs目录下找到PDF文档(建议参考AdvancedUserDocumentation.PDF文档)。

2.语法

a.设置变量

变量名必须用%来封装,即%变量名%

全局变量

变量区域

简单的说,当区域建立后(比如,循环,另一个模版等),在区域中调用区域外的变量,则需要用Outer.变量名来指明。

b.循环

c.判断条件

d.集合

e.特殊符号

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1