您的位置:首页 > 编程语言

反转Hibernate Reverse Engineering)模板的代码自动生成规则

2018-01-24 10:55 381 查看


反转Hibernate Reverse Engineering)模板的代码自动生成规则

在项目中,往往会用到myeclipse的自动生成代码功能,比如本人项目用其从数据库表生成对应的实体类和映射文件,但是,由于数据库表字段名称很不规范,无业务含义很难认,用myeclipse默认的规则生成得到的实体属性名是驼峰命名,很难由此推断出对应的数据库表字段名,故项目制定统一规范,实体类属性名为表字段名小写。需要修改默认的代码生成规则。
网上找了不少资料以及文档,方法总结如下:
方法一:修改myeclipse中自动生成代码的模板文件
在myeclipse目录中搜索关键字"templates",可以找到一个如myeclipse_templates_6.0.1GA.zip的包,解压即可得到自动生成代码用到的所有模板文件,如需修改其中几个模板文件,则按原目录结构只留下修改的模板文件。在Hibernate Reverse-Engineering的对话框中,钩选Use custom templates,输入你存放修改后模板文件的文件夹(custom_myeclipse_templates)路径,就可以使用到自定义的模板了。具体看参考该包的说明文档。
                                                                             
 
方法二:集成并自定义反转策略类
自定义一个类,继承自org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy,覆盖其中生成代码的方法。具体参考方法一中那个包的说明文档。
我把其中一个例子贴出来如下,在自动生成的所有实体属性名前加"ME_"前缀下:
5.6 sing a custom reverse engineering strategy
Add the MyEclipse Persistence      Tools library to your project.
Right click your project and       select Properties.
On the Java Build Path       page, choose Add Library... on the Libraries tab.
Choose MyEclipse Libraries       and then MyEclipse Persistence Tools.
Press Finish.

Figure 16. Adding the MyEclipse Persistence Tools library
Create a new class in your project      which extends the org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy      class.
Define the single argument      constructor and override a method of interest, for example, columnToPropertyName.      

     Here's an example which prefixes all generated propertes with      "ME_"
MyStrategy.java
package com.genuitec.hibernate; 

  

  import org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy;   

  import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;   

  import org.hibernate.cfg.reveng.TableIdentifier;   

  

  public classMyStrategy extendsDelegatingReverseEngineeringStrategy { 

  

  publicMyStrategy(ReverseEngineeringStrategystrategy)   { 

  super(strategy);   

  } 

  

  publicString   columnToPropertyName(TableIdentifier table, String columnName) { 

  return"ME_" + super.columnToPropertyName(table, columnName); 

  } 

  

  }
Figure 17. MyStrategy.java Source      Code Listing
On page 2 of the reverse      engineering wizard, specify the class you just created 

                

     

     Figure 18. Specifying the reverse engineering strategy
附资料一:
自定义Struts的JSP模板和Hibernate的DAO模板
这一阵子在MyEclipse里做项目,用到了Struts和hibernate功能,起初,对自动生成赞不绝口,但后来,发现自动生成的代码也有不方便的地方,比如:

一Struts

当new一个JSP,使用Standard JSP using Struts 1.2时,生成的页面代码中只包含了Struts标签但很多时候,我们需要在页面中使用到JSTL标签,我们应该把常用的几个JSTL标签加到JSP页 面中,就像这样:

其次,Struts1.2的 似乎有些问题,它表示的地址是当前页面的地址,而不是应用程序的根目录,因此,这个base我们还是得用内嵌的Java代码得到,就像这样:
String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":" +request.getServerPort()+path+"/";

然后在之间加入base标签:

这样,用起来才比较方便一点但每次都改页面,显然做了很多重复的劳动,我想MyEclipse在生成这样的页面时,肯定用到了模板那么到底是那个模板呢?我们来搜搜看

首先说明一下,我用的不是MyEclipse的All-In-One安装,所以有两个目录,一个是Eclipse的解压目录,另一个才是 MyEclipse的安装目录:MyEclipse 5.5.1 GA如果用的All-In-One安装,可能只有一个目录,就是MyEclipse 5.5.1 GA这里,我就把这个目录称为安装目录了

在安装目录下搜索:Struts-1_2.vtl,可以得到这个文件,打开看看,其头部结构与生成的页面很相似,因此,我们只需要在适当的地方添上自己的代码即可修改前还是要注意备份

二hibernate

使用Hibernate Reverse Engineering最大的好处就是它可以自动生成PO和DAO的源码,以及映射配置文件但是看看DAO的代码,才发现里面的数据库操作方法都是实例 方法,用起来还必须先
4000
new一个DAO,个人觉得没有这个必要,使用静态方法就可以了,但我不可能给每个DAO的每个方法都加一个static吧于是, 跟上面一样,改模板

首先得分析一下,生成的DAO是继承的BaseHibernateDAO,而BaseHibernateDAO是扩展的 IBaseHibernateDAO接口,在这个接口中,定义了getSession方法要把数据库操作方法改成static,这个 getSession方法也必须是static,但是在接口中不能定义是static的方法,那么唯一的办法就是不管IBaseHibernateDAO 接口,在BaseHibernateDAO类中自己实现一个静态的getSession方法

BaseHibernateDAO有模板文件,但是没有必要改它,因为一个工程只用得到一个BaseHibernateDAO我们要改的模板文件是用于 生成具体DAO类的然而在安装目录下用hibernate关键字搜一搜,并没有发现哪个文件与我们的DAO有关,难道MyEclipse把生成规则写死 在代码里了吗?

我不相信MyEclipse的开发人员那么糊涂,于是用templates关键字搜索了一下,发现了这个: myeclipse_templates_5.5GA.zip,打开一点,发现里面全部是有关hibernate的模板文件,另外有一个readme的说 明,关键部分如下:
2) Edit the velocity templates you wish to customize. Note: POJO templates are present in the pojo folder DAO template in the dao folder HBM templates in the hbm folder 3) Optional: Though not necessary,
it is recommended that you delete the velocity templates you do not plan to customize. This will prevent future confusion over which templates are being processed by MyEclipse. 4) Invoke the JPA/EJB3/Hibernate Reverse-Engineering wizard and select "Use custom
templates". Manually enter or click the browse button to select the myeclipse_templates_5.5GA folder.

上面的意思是:把解压之后的文件夹放在一个方便的地方(不需要放在原目录下,那样找起来很不方便),修改它,然后删掉其他你没有修改的文件,以免发生可能的冲突,最后,在Hibernate Reverse-Engineering的对话框中,钩选Use custom templates,输入你解压后的文件夹(myeclipse_templates_5.5GA)路径,就可以使用到自定义的模板了

照这个意思,我修改了DAO文件夹下的daohome.vm和facadeif.vm,在其中所有的public标识后加上了static(我也不知道哪 些是hibernatet真正用到的,反正我不用EJB和JPA)然后照它的意思试 了一把,果然,DAO方法全变成了static
附资料二:
Hibernate Reverse Engineering 向导

Java src folder 选中映射文件, POJO 和 DAO 生成后所在的项目和源码文件夹.

Java package 映射文件, POJO 和 DAO 生成后所在的包.

Hibernate mapping file 从选中的表格生成映射文件.

Update hibernate configuration 将生成后的映射文件添加到 Hibernate 配置文件中.

Java Data Object 为映射文件和表格生成对应的数据对象 (POJO).

Create abstract class 为每个数据对象生成一个抽象的父类. 这个抽象类将在以后的重新生成过程中覆盖掉, 但是对应的子类将不会被覆盖掉.

Base persistence class 如果需要的话, 输入生成的 POJO 所要集成的父类的完整名称.

Java Data Access Object 生成便于访问映射后的类和表格的数据访问对象. 用户可以在 Basic, Spring 和 JNDI DAO 中选择一种.

Generate precise findBy methods 为映射类中的每个属性生成一个 "findBy" 方法. 例如 findByFirstName("name");

Use custom templates 覆盖 MyEclipse 的内部 velocity 模版为你自己的版本.参考 使用模版来更好的调节生成的代码 来获取更多信息.

Template directory 包含了自定义模版的目录树的根节点.

图 14. Hibernate Reverse Engineering 向导 - 第 2 页

第 2 页可以使用默认的设置, 选择 Next.

表 5 - Hibernate Reverse Engineering 向导 - 第 2 页

Rev-eng settings file 这个文件包含了反向工程的配置和选项以供以后使用. 点击 Setup... 按钮来选择现有的文件或者创建一个新的文件.如果找不到一个这样的配置文件的话向导将会自动创建此文件.

Custom rev-eng strategy 允许你指定一个自定义的反向工程策略类. 这个类允许你用编程的方式来自定义反向工程处理过程的各个方面. 参考 使用自定义反向工程策略 来获取详细信息.

Type Mapping 决定是否在类型映射属性中使用 Java 或者 Hibernate 类型, 例如 java.lang.String 对应 string. 这个设置只能在向导第 3 页的 Customized Type Mappings 列表中没有指定更多信息时才能使用.

ID Generator ID Generator 是 Hibernate 映射文件必须有的内容. 它定义了持久类实例的唯一主键生成器 Jaav 类. 参考 资源 部分里面的 Hibernate 文档链接, 里面描述了每个 ID 生成器的详细信息.如果留空或者更详细的配置在这个向导的第 3 页没有配置, Hibernate 映射引擎将自动为你选择一个 ID 生成器.

Generate basic typed composite IDs 如果数据库表格包含有多个列的主键, 将总是使用 <复合主键> 映射.如果这个选项启用并且有对应的多个外键, 每个主键列将依然会被作为'简单的' 标量 (string, long, 等), 而不是引用到一个实体. 将会创建 <many-to-one> 元素, 但是它们将会标记为非可更新和非可插入的字段.如果你禁用这个选项(默认推荐用这种方式), 将会创建 <key-many-to-one> 元素来代替上面的生成内容.

Generate version and timestamp tags 如果启用, 名为 "version" 和 "timestamp" 的列将会在生成的映射文件中作为 <version> 和 <timestamp> 标记出现.

Customized Type Mappings 允许你来指定一个自定义的 JDBC 类型到 Hibernate 类型的转换, 使用 Length, Scale, Precision 和 Nullability 作为精度控制对应原来的 JDBC 类型.

# 再第 3 页页可以使用默认的设置, 选择 Finish 将启动反向工程处理.

图 15. Hibernate Reverse Engineering 向导 - 第 3 页

表 6 - Hibernate Reverse Engineering 向导 - 第 3 页

Class name 对应当前数据库表格的数据对象类的完整名称.

ID Generator 想要对当前表所使用的 ID 生成器.

JDBC type 对当前列所使用的 JDBC 类型覆盖.

Property name 对应当前列所生成的属性名.

Hibernate type 对应当前列的 Hibernate 类型.

Include referenced / referencing tables 包含反向工程时当前数据库表引用的表格以及其它引用到当前表的数据库表.

Generate support for ListedTable(fk)->UnlistedTable and UnlistedTable(fk)->ListedTable 生成关联到当前表格的关联表的尚未反向工程过的代码, 这些表在当前配置页面尚未被显示.在这个向导完成之后将会进行下面所列的操作:

*创建类 AbstractEchoMessage . 这个抽象类提供了所需的 Hibernate 兼容的功能例如 public 的读取器和设置器方法, 这些方法对应的持久化属性和 ECHO_MESSAGE 数据库表格中的列相对应.

*创建了一个 EchoMessage Java 类, 是 AbstractEchoMessage 类的一个具体的子类. EchoMessage 的目的是为了被修改后提供额外的业务和验证逻辑, 并且不会被后续的生成代码过程所覆盖.

*创建了 EchoMessage.hbm.xml Hibernate 映射描述符. 这个文件指示 Hibernate 如何将 EchoMessage Java 类和 ECHO_MESSAGE 数据库表格中的数据相互映射.

*在文件 hibernate.cfg.xml 中注册 EchoMessage.hbm.xml 映射描述符.

*创建了 Java 类 EchoMessageDAO. 这个类提供了对 EchoMessage 数据对象类的方便的访问和操作.

*创建 IBaseHibernateDAO 接口和 BaseHibernateDAO 类. 这些类对基本的 DAO 来说是必要的, 因为它使用了添加 Hibernate 功能时候所生成的 Session 工厂类(com.genuitec.hibernate.HibernateSessionFactory)来获取 Hibernate 会话.

图 15 高亮显示了所生成的类, 关键方法和映射文件, 以及被添加到 hibernate.cfg.xml 文件中的对生成的映射文件的引用.

图 15. Hibernate 反向工厂向导执行结束后更新过的项目内容

5.5 使用模版调整生成更好的代码

* e.doc/html/quickstarts/hibernate/myeclipse_templates_5.5GA.zip">这个文件到你的电脑的文件系统上.

* 按照 README.txt 文件中的说明来自定义这个模版.

* 调用反向工程向导, 在第 1 页选择启用 Use custom templates 选项, 然后将 Template directory 指向到包含模版树的文件夹e.

5.6 使用自定义反向工程策略

1. 向你的项目中添加 MyEclipse Persistence Tools 类库.

* 右键点击你的项目然后选择 Properties.

* 在 Java Build Path 页面, 在 Libraries 面板下选择 Add Library....

* 选择 MyEclipse Libraries ,接着选中 MyEclipse Persistence Tools.

* 点击 Finish.

图 16. 添加 MyEclipse Persistence Tools 类库

2. 在你的项目中创建一个新类, 让这个类继承自 org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy 类.

3. 定义一个单参数的构造器, 然后覆盖其中的感兴趣的一个或者多个方法, 例如, columnToPropertyName.

这里是一个例子, 将在所有生成的属性前添加一个 "ME_" 前缀.

MyStrategy.java

package com.genuitec.hibernate;

import org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy;

import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;

import org.hibernate.cfg.reveng.TableIdentifier;

public class MyStrategy extends DelegatingReverseEngineeringStrategy {

public MyStrategy(ReverseEngineeringStrategy strategy) {

super (strategy);

}

public String columnToPropertyName(TableIdentifier table, String columnName) {

return "ME_" + super.columnToPropertyName(table, columnName);

}

}

图 17. MyStrategy.java 源代码清单

4. 在反向工程向导的第 2 页, 选中刚才所创建的类

图 18. 指定反向工程策略

5.7 编辑映射文件

MyEclipse 包含了定制过的 XML 编辑器来专门用于修改 Hibernate 映射文件 (*.hbm.xml). 当双击映射文件的时候编辑器将会自动打开. 你也可以通过右键点击文件然后选择 Open With > MyEclipse Hibernate Mapping Editor.功能

* 超链接浏览到引用到的类和属性.

* 类名自动完成提示.

* 属性名自动完成提示.

* 映射文件元素, 属性和值的内容完成提示.

图 19. Hibernate 映射文件编辑器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐