Sybase 公司PowerDesigner上海研发中心 汪晟杰
1.简述
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,提供HQL查询语言,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。使用Hibernate,必须为配置映射文件—ClassMapping File和Configuration File,现在市场上提供了诸多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中扩展了一个功能,那么继承它的模型均拥有这样的功能和脚本,也可以覆盖重写这样的功能,以实现多态概念。
打开扩展模型编辑窗口:选择ModelExtended Model Definition,在弹出的窗口的Toolbar上选择Import Extended Model Definition(倒数第二个按钮)来加载已有的模型,也可以新建扩展模型(选择Add Row按钮,然后在表格中双击要编辑的模型的第一列即可弹出如图1所示的界面)
 
为了让读者更好的了解PD的元模型概念,截取了Hibernate代码生成工具所用到的元模型架构图,如图2所示。 读者可以在PD的安装目录下找到:<PD安装路径>\Examples\MetaModel.oom,图表存放在PdOOM下,名字为Class Objects。
由于篇幅原因,会摘取典型的代码和模型来讲解如何设计Hibernate代码生成工具。
 
Hibernate代码生成的总体架构流程(活动图)
Hibernate自动生成文件的原则是:
1) 子类的映射信息挂在根类的映射文件下(Root Class),即子类将不独立生成代码
2) Value-Type类以及没有持久化的类,将不生成代码。
3) 不为非类对象生成代码(比如接口等)其中:
Check Models in Diagram: Hibernate模型检测,判断DomainModel是否符合Hibernate语法。如果出错,PD将抛出错误提示信息(提供自动纠错的功能)
Generate Configuration File:选择模型属性(Model->Model Properties),用户可以在Extended Attribute下设置配置信息,PD会根据配置信息生成Configuration File。
Get each class in Diagram:这是PD的机制,它会自动获取UML内的所有模型元素,并根据每个模型的扩展属性(Profile\Generated File)的流程来生成代码文件。
Generate Basic Mapping:类的基本映射,它包含id,composite-id,propery等。
Get SubClass Style:子类的映射,递归获取。
Generate Join:当持久类对应于多张表的映射时,需要用Join来指明。
Generate Association Mapping:根据类之间Association的类型来判断是哪种关连映射,本工具支持one-to-one,one-to-many,many-to-one,many-to-many(根据Association Properties的Detail标签下的Multiplicity来设置),支持集合Array,Set,List,bag,idbag(根据ContainType来设置)。
Get Java Code Information:扩展模型是基于现有的语言模型,即扩展模型能够获取语言模型的模版和各种设置,对于Hibernate的Java持久类,我们只须在Java代码下增加对应Attribute的Getter和Setter即可。%source%
Generate Invoke Bean: 生成Hibernate的CRUD函数。
Generate Test Case: Hibernate测试用例代码,将生成的随机数据来验证Hibernate的正确性。
Generate Log4J: 生成Log4J的配置文件
Generate ANT build.xml: 当用户在Generation Files下的Options中设置Ant为True,并配置了Ant的Lib的路径,则Hibernate Tools会生成build.xml, 然后将会自动运行Ant来测试Hibernate, 生成结果将会被Log4J存入日志。2.技术要点
O/R Mapping
PD从8.0开始,就不断加强O/R Mapping,除了代码模型的生成以外,PD也生成O/R Mapping的定义,诸如生成EJB CMP组件。用户可以定义O/R Mapping来建立OOM与PDM之间的关系。
PD支持3种方式的O/R Mapping:
第一种是从类图转换成数据模型之后由PD自动建立连接(适用于自顶向下的设计过程);
第二种是从数据模型转换成类图之后由PD自动建立连接(适用于自下向上的设计过程);
第三种是建立类图和数据模型之后由用户手动建立(适用于同步设计或者是后期的修改)
建立过程:
第一种:选择类图,然后设计持久类(POJO),完毕之后,选择Tools->Generate Physical Data Model。在弹出的窗口中,选择Detail标签,选中O/R Mapping选项,即可。读者可以选择是更新现有的数据库还是新建数据库。
第二种:与第一种建立过程相似,只是换成在数据库模型中选择Generate Object-Oriented Model
第三种:用户必须首先建立DataSource,在左边WorkSpace树形目录下找到类文件,然后右击选择New\Data Source,在弹出的窗口的Models标签中选择 ,并选择想与之关联的数据库模型。在类模型中打开类属性(双击要建立O/R Mapping的类),选择Mapping选项卡,点击 按钮添加刚才建立的DataSource。然后点击 添加类映射的数据表,即建立完毕。
用户可以添加多张表,它表示一个类可能对应多张表的映射,Hibernate的映射则应该用Join属性来指明。
注:当用户建立了ClassSource,PD会根据类的属性和表的字段自动建立AttributeMapping,当然用户也可以在AttributeMapping属性页下对其映射进行修改。
大家知道,Hibernate的映射文件必须包含对表的表述(比如:column,property属性等等),在PD中,通过元模型中的Mapping可以轻易地获取对应的表信息。图4是GTL中用到的O/R Mapping元模型。
O/R Mapping架构图:
更多详细请见:http://www.newwhy.com/thread-982-1-1.html