Hibernate Tools源码的使用

Eclipse 中Hibernate tools 的安装和使用 http://zhoualine.iteye.com/blog/1190141

源码里面有一个很好的格式化类:org.hibernate.tool.hbm2x.XMLPrettyPrinter
调用

获得源码的方法:
https://github.com/hibernate/hibernate-tools, 然后建立maven工程
得到源码后需要处理的问题:
1.修改pom.xml的name等信息,来适合自己建立的工程。
2.注释掉pom.xml一些没必要的数据库信息。
3.注释几个地方

4.加入sql server driver,先执行mavn
mvn install:install-file -Dfile=/mnt/D/work_documents/jar2mvn/sqljdbc-4.0.jar -DgroupId=sqljdbc -DartifactId=sqljdbc -Dversion=4.0 -Dpackaging=jar
再加入依赖:

5. 加入
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/config/hibernate.cfg.xml

/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/com/pandy/RunHibernateTools.java

可能要适当修改
6.增加一个存放代码的文件夹
/mnt/D/work_documents/workspace_ide/HibernateTools/codes
7. /mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.java 增加一个方法:

mian方法修改:

8.生成的DAO后缀是Home,要是改成XxxxDAO,以DAO为后缀。
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/DAOExporter.java, 修改以下方法为:

9.模板文件,如果生成的代码需要修改,可以修改模板,路径为
/mnt/D/work_documents/workspace_ide/HibernateTools/src/templates
10. 配置需要生成代码的表
A: 跟踪代码
/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java
前面有一段static代码,里面有 ge.getConfiguration().getClassMappings(),ge.getConfiguration()里面有一个tables属性,映射了table=>java file.
B:到/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/AbstractExporter.java  去查看这个configuration到底怎么初始化?
可以看到它的初始化是GenericExporter构造函数里面传入。那么就要找到什么时候创建GenericExporter?
C:
它是在POJOExporter构造函数里面,那么就在main函数的POJOExporter exporter = new POJOExporter(cfg, getOutputDir(properties));创建。
D:到main函数更在cfg的创建,并监视里面的tables什么时候有值?cfg.readFromJDBC()这里被赋值,继续跟踪。
D: 跟踪到/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/cfg/JDBCBinder.java,readFromDatabase()方法DatabaseCollector collector = readDatabaseSchema(catalog, schema),被赋值。
E: 让它继续找,我们只是在生成的时候过滤掉就可以了。那么回到A,在这里做手脚。
———–
I: /mnt/D/work_documents/workspace_ide/HibernateTools/src/java/config/hibernate.cfg.xml增加一个

II:/mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/cfg/JDBCMetaDataConfiguration.java最后面增加

III: /mnt/D/work_documents/workspace_ide/HibernateTools/src/java/org/hibernate/tool/hbm2x/GenericExporter.java修改static段的代码:

这样就搞定了。可以模仿做排除功能。
11.打包成jar, 参考:http://panyongzheng.iteye.com/blog/1759912http://sundful.iteye.com/blog/1850070,修改pom.xml使用maven-compiler-plugin插件的java版本为1.7。 并修改插件的版本号http://qiang106.iteye.com/blog/1388645

命令为:
测试并打包:mvn -e clean package
不需要测试打包:mvn -e clean package -DskipTests
复制源码,不测试打包:mvn clean assembly:assembly -DskipTests
12.执行jar:
复制得到依赖jar: mvn dependency:copy-dependencies -DoutputDirectory=target/lib
执行不含源码jar:java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1.jar
执行含源码的jar:java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1-jar-with-dependencies.jar
最后的打包并执行的两个命令:
mvn -e clean package dependency:copy-dependencies -DskipTests -DoutputDirectory=target/lib
java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1.jar

13.执行是输入hibernate.cfg.xml文件路径
A:修改run方法,增加一个hibernate.cfg.xml的绝对路径参数,并注释掉原本硬编码路径:

B:修改mian方法:

最终执行命令: java -jar /mnt/D/work_documents/workspace_ide/HibernateTools/target/hibernate-tools-Pandy.4.0.0-CR1.jar /mnt/D/work_documents/workspace_ide/HibernateTools/hibernate.cfg.xml
14.POJO的源码主键生成
org.hibernate.tool.hbm2x.pojo.EntityPOJOClass, generateAnnIdGenerator()方法。因为不知道怎么传入主键的配置,所以尝试在这里修改。我改成了:要么是uuid,要么是auto类型,这个是自己的需求。

修改源码默认产生equal,toString,hashCode方法:
/mnt/D/work_documents/workspace_ide_linux/HibernateTools/src/java/org/hibernate/tool/hbm2x/pojo/BasicPOJOClass.java
toString:

 

equal & hashCode:

修改版本号信息:
/mnt/D/work_documents/workspace_ide_linux/HibernateTools/src/java/org/hibernate/tool/Version.java

自己的修改hibernate-tools的模板和修复Comment乱码问题:http://kennylee26.iteye.com/blog/1229993
Hibernate Tools生成注释:http://www.blogjava.net/pauliz/archive/2009/11/13/302162.html
修改源码的地方:
输出中文乱码:
1.
TemplateProducer.produce(), 应该使用UTF-8输出到文件.
Writer fileWriter = null;
….
fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destination), “UTF-8”));
2.src/org/hibernate/tool/hbm2x/jtidy.properties
input-encoding=utf-8
output-encoding=utf-8
3.反转表名等类,都存放在:org.hibernate.cfg.reveng.dialect, 并针对相应类重载getTables方法.
DAO:
src/org/hibernate/tool/hbm2x/DAOExporter.java, 这里修改输出类的文件名,extends,implements等.
dao/daohome.ftl, 这里可以修改默认的方法,和类名字等.
POJO:
src/org/hibernate/tool/hbm2x/POJOExporter.java, 这里修改输出类的extends,implements等.
pojo/Pojo.ftl

去掉注解的schema,catlog, Ejb3TypeDeclaration.ftl,Line8,7

POJO的头部注释信息:生成表的注释:
A:修改或者重载JDBCMetaDataDialect的继续类的getTables()方法,确保这里的rs.getString(“remarks”)能得到数据库的注释,否则自己查找数据库得到注释.
B:src/pojo/PojoTypeDeclaration.ftl,增加表注释
${pojo.getClassJavaDoc(pojo.getDeclarationName() + ” By Pandy.”, 0)}
改为
<#if clazz.table.comment?exists>
/**
* Entity: ${clazz.table.comment}
*/
</#if>

extends:
BasicPOJOClass.getExtendsDeclaration(), Line190
EntityPOJOClass.getExtends(), 写入extends, 或者直接Line84固定返回extends

implements:
BasicPOJOClass.getImplementsDeclaration(), Line200
EntityPOJOClass.getImplements(), Line87
给POJO增加一些默认的函数:
src/pojo/Pojo.ftl, Line11,
增加serialVersionUID:
src/pojo/Pojo.ftl, Line7
private static final long serialVersionUID = 1L;

修改数据库语言:Dialect, 这里影响到pojo.id的注解
MetaDataDialectFactory.createMetaDataDialect();
这里没有正确从文件hibernate.properties获得dialect, 所以直接修改property=默认的dialect,
比如:String property =”org.hibernate.cfg.reveng.dialect.SQLServerMetaDataDialect”;
SQLServerMetaDataDialect这个是在Hibernate-Tools.jar里面的.

http://tonydark01.iteye.com/blog/1721834
直接用junit或mian函数运行,而非依赖于jboss的插件,省的更新eclipse或者迁移的时候各种麻烦 ,副项目包备份.
1.增加slf4j-simple-1.5.2.jar,
2.增加驱动程序包,
3.给JDBCMetaDataConfiguration.java增加一个方法

4.给hibernate.cfg.xml增加一个属性

,
注意,貌似许多属性都是在这里增加的.