如鵬網 大學生計算機學習社區

          CowNew開源團隊

          http://www.cownew.com 郵件請聯系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評論 :: 0 Trackbacks


          CowNew開源團隊網站 http://www.cownew.com
          作者 楊中科 是CowNew開源團隊發起人之一,郵箱about521? at 163 dot com
          論壇 http://www.cownew.com/newpeng/
          轉載請注明此版權信息


          ?? 最近準備把進銷存項目激活,這樣一方面可以讓更多的人有機會參與到開源開發中來,另一方面也把SQL翻譯器、SQL優化器、JDBMonitor應用到這個項目中,這樣這三個基礎模塊就可以在實際項目應用中得到驗證和增強。
          ??? 我準備用hibernate實現持久層,于是到hibernate的網站上把hibernate3下載下來,看了看有個hibernatetools,是個hibernate在eclipse下的輔助工具,也down了下來,用了用感覺不錯。可以直接從數據庫表生成POJO和hbm.xml(其實我不是很喜歡這種開發方式,我更喜歡我用建模工具來寫POJO,然后用工具生成hbm.xml和DDL,不過好像hibernate3現在還沒有這種工具,如果哪位朋友知道有這種工具,希望賜教)。
          美中不足的是它生成的javabean的字段名是完全和數據庫字段名一致、生成的javabean的類名是完全和數據庫表名一致。出于清晰以及可移植的考慮(也是公司的開發規范養成的習慣),我設計的表名全部以"T_"開頭,中間再加上子系統名,最后才是表意的表名,比如用“T_PS_BOM”表示生產管理系統中的物料清單表;字段名全部以“F”開頭,比如FId,FName。
          這樣就導致生成了如下的javabean:

          public class TPSBOM
          {
          ?? .......
          ?? public String getFID()
          ?? ...
          ?? public String getFNumber()
          }


          ??? 看起來很不直觀。我剛剛想放棄這個工具,想了想,“拿來就用,不好用就換”可不是做開源人該有的精神呀。鉆研一下。
          看看了Hibernate Code Generation頁簽中有一個“reveng Strategy”,什么意思?“反向工程策略”??好像有門兒,點擊“Browse”彈出一個類選擇對話框,竟然看到了它默認顯示的“DefaultReverseEngineeringStrategy”類了,我在hibernatetools的安裝目錄找來找去,終于在plugins\org.hibernate.eclipse_3.2.0.beta6\lib\tools下的hibernate-tools.jar中找到了這個類的影子,用反編譯工具反編譯一下(懶得去網上下源碼了,呵呵)。一個個方法名展現在我面前:
          tableToClassName
          columnToPropertyName
          columnToHibernateTypeName
          。。。
          ??? 這不就是在把數據庫相應的項映射成java相應的項嗎?
          ??? 開工!
          ??? 新建一個類CowNewReverseEngineeringStrategy,繼承自DefaultReverseEngineeringStrategy,override? tableToClassName、
          columnToPropertyName這兩個方法,在這兩個方法中寫入自己的轉換邏輯。
          然后打包成jar包,放到plugins\org.hibernate.eclipse_3.2.0.beta6\lib\tools下,然后在plugins\org.hibernate.eclipse_3.2.0.beta6\lib\tools\MANIFEST.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)
          ?{
          ??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"));
          ?}
          }


          ?

          posted on 2006-07-16 22:27 CowNew開源團隊 閱讀(1521) 評論(4)  編輯  收藏

          評論

          # re: cownew開源-給hibernateTools寫個插件 2006-07-17 01:08 原創專欄 開源學習
          你們太孤陋寡聞了。
          輪子輪子輪子。

          你們這個團隊應該多考察考察,跟得上時代。與時俱進呀

          不過好像hibernate3現在還沒有這種工具,如果哪位朋友知道有這種工具,希望賜教

          XDoclet
          XDoclet
          XDoclet
          XDoclet
          XDoclet
            回復  更多評論
            

          # re: cownew開源-給hibernateTools寫個插件 2006-07-17 08:26 mixlee11
          這種東西還是自己寫一個的好。
          我剛開始的時候也是在網上找,找了好幾個都不如意。
          自己寫一個一晚上搞定,結果找插件的時間都浪費好幾天。
          用freemarker做模板自己開發,可以在建模的時候把注釋也寫進數據庫,
          然后可以把字段的remark讀出來寫進自己的pojo里,中文注釋在生成代碼的時候就同時搞定。當然類名字段名你想怎么生成都可以啦,所以靠別人不如靠自己。  回復  更多評論
            

          # re: cownew開源-給hibernateTools寫個插件 2006-07-17 16:44 霉干菜
          @原創專欄 開源學習

          我覺得作者說的不是XDoclet這個意思,我估計他想要達到的是通過UML建摸直接通過工具生成數據庫表,猜測而已  回復  更多評論
            

          # re: cownew開源-給hibernateTools寫個插件 2006-07-17 19:47 CowNew開源團隊
          感謝各位指教.在公司一直是用公司自己開發的ORMMaping引擎,所以開源的ORM工具用的機會少一些,hibernate也是去年評估各個開源ORM工具的優劣的時候簡單用了一下,所以難免才疏學淺.
          正如霉干菜說的,我真正想要的工具是我畫類圖就可以了,然后所有的我不關心的java代碼和配置文件都自動生成,這樣能有更多精力投入業務開發和整體技術 業務框架的搭建。
          如果再找不到能滿足要求的開源工具的話,也許自己寫一個也不錯,呵呵,先做成codegenerate工具,然后逐步轉化成一個元數據驅動的東西,呵呵美極美極,這一直都是我的夢想卻沒時間去做的東西。  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 阿勒泰市| 山东| 长丰县| 钟山县| 阿勒泰市| 东兰县| 依兰县| 壤塘县| 崇文区| 奉化市| 海南省| 唐山市| 石渠县| 荔波县| 宁晋县| 奉化市| 津市市| 达日县| 洪雅县| 肥西县| 且末县| 隆昌县| 肃北| 灵川县| 穆棱市| 尚义县| 阳新县| 永和县| 贡觉县| 邹平县| 射洪县| 芦山县| 宕昌县| 牡丹江市| 若尔盖县| 楚雄市| 哈密市| 齐齐哈尔市| 新野县| 安乡县| 乳山市|