cownew开源-给hibernateTools写个插件
点击次数:84 次 发布日期:2008-11-09 08:44:12 作者:源代码网
|
最近准备把进销存项目激活,这样一方面可以让更多的人有机会参与到开源开发中来,另一方面也把SQL翻译器、SQL优化器、JDBMonitor应用到这个项目中,这样这三个基础模块就可以在实际项目应用中得到验证和增强。 public class TPSBOM { ....... public String getFID() ... public String getFNumber() } 看起来很不直观。我刚刚想放弃这个工具,想了想,“拿来就用,不好用就换”可不是做开源人该有的精神呀。钻研一下。 看看了Hibernate Code Generation页签中有一个“reveng Strategy”,什么意思?“反向工程策略”??好像有门儿,点击“Browse”弹出一个类选择对话框,竟然看到了它默认显示的“DefaultReverseEngineeringStrategy”类了,我在hibernatetools的安装目录找来找去,终于在pluginsorg.hibernate.eclipse_3.2.0.beta6lib ools下的hibernate-tools.jar中找到了这个类的影子,用反编译工具反编译一下(懒得去网上下源码了,呵呵)。一个个方法名展现在我面前: tableToClassName columnToPropertyName columnToHibernateTypeName 。。。 这不就是在把数据库相应的项映射成java相应的项吗? 开工! 新建一个类CowNewReverseEngineeringStrategy,继承自DefaultReverseEngineeringStrategy,override tableToClassName、 columnToPropertyName这两个方法,在这两个方法中写入自己的转换逻辑。 然后打包成jar包,放到pluginsorg.hibernate.eclipse_3.2.0.beta6lib ools下,然后在pluginsorg.hibernate.eclipse_3.2.0.beta6lib oolsMANIFEST.MF中把这个新增包的内容加上,关闭eclipse,加个-clean参数启动eclipse,然后点击“Hibernate Code Generation”,把“reveng Strategy”填成“com.cownew.DevTools.hibtools.RevEng.CowNewReverseEngineeringStrategy”,“Run”!!! 晕倒,竟然报错“com.cownew.DevTools.hibtools.RevEng.CowNewReverseEngineeringStrategy Exception while generating code Reason org.hibernate.console.HibernateConsoleRunTimeException:Could not create or find com. with one argument deleate constructor” 看来是反射调用的时候出了问题,重新打开hibernate-tools.jar,仔细观察,竟然发现了一个DelegatingReverseEngineeringStrategy,它多 了一个参数为“ReverseEngineeringStrategy delegate”的构造函数,而其他调用都是转发给ReverseEngineeringStrategy了,晕倒,搞不懂它在做什么,也没时间研究了,给CowNewReverseEngineeringStrategy也曾街一个参数为“ReverseEngineeringStrategy delegate”的构造函数,重新打包,重新启动eclipse,哈哈,一切搞定,终于生成我可爱的, public class PersonInfo { public String getNumber()。。。 public String getId()。。。 } 了。 附全部代码: package com.cownew.DevTools.hibtools.RevEng; import java.beans.Introspector; import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; import org.hibernate.cfg.reveng.ReverseEngineeringSettings; import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; import org.hibernate.cfg.reveng.ReverseEngineeringStrategyUtil; import org.hibernate.cfg.reveng.TableIdentifier; import org.hibernate.util.StringHelper; public class CowNewReverseEngineeringStrategy extends DefaultReverseEngineeringStrategy { public CowNewReverseEngineeringStrategy(ReverseEngineeringStrategy delegate) { super(); } private ReverseEngineeringSettings settings = new ReverseEngineeringSettings(); public String tableToClassName(TableIdentifier table) 软件开发网 www.mscto.com { String tableName = table.getName(); if (tableName != null && tableName.toUpperCase().startsWith("T_")) { String pkgName = settings.getDefaultPackageName(); int lastIndex = tableName.lastIndexOf("_"); tableName = tableName.substring(lastIndex 1, tableName.length()) "Info"; String className = toUpperCamelCase(tableName); if (pkgName.length() > 0) return StringHelper.qualify(pkgName, className); return className; } else { return super.tableToClassName(table); } }; public String columnToPropertyName(TableIdentifier table, String column) { if (column != null && column.toUpperCase().startsWith("F")) { String cownewColName = column.substring(1, column.length()); String decapitalize = Introspector .decapitalize(toUpperCamelCase(cownewColName)); return keywordCheck(decapitalize); } else { return super.columnToPropertyName(table, column); } } private String keywordCheck(String possibleKeyword) { if (ReverseEngineeringStrategyUtil .isReservedJavaKeyword(possibleKeyword)) possibleKeyword = "_"; return possibleKeyword; } public void setSettings(ReverseEngineeringSettings settings) { super.setSettings(settings); this.settings = settings; } public static void main(String[] args) { TableIdentifier table = new TableIdentifier("T_BD_Person"); //TableIdentifier table = new TableIdentifier("T_Person"); //TableIdentifier table = new TableIdentifier("Person"); CowNewReverseEngineeringStrategy revEng = new CowNewReverseEngineeringStrategy(null); String className = revEng.tableToClassName(table); System.out.println(className); System.out.println(revEng.columnToPropertyName(table, "FId")); System.out.println(revEng.columnToPropertyName(table, "Id")); } } 源代码网推荐 源代码网供稿. |
