<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

    CowNew開(kāi)源團(tuán)隊(duì)

    http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks


    CowNew開(kāi)源團(tuán)隊(duì)網(wǎng)站 http://www.cownew.com
    作者 楊中科 是CowNew開(kāi)源團(tuán)隊(duì)發(fā)起人之一,郵箱about521? at 163 dot com
    論壇 http://www.cownew.com/newpeng/
    轉(zhuǎn)載請(qǐng)注明此版權(quán)信息


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

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


    ??? 看起來(lái)很不直觀。我剛剛想放棄這個(gè)工具,想了想,“拿來(lái)就用,不好用就換”可不是做開(kāi)源人該有的精神呀。鉆研一下。
    看看了Hibernate Code Generation頁(yè)簽中有一個(gè)“reveng Strategy”,什么意思?“反向工程策略”??好像有門(mén)兒,點(diǎn)擊“Browse”彈出一個(gè)類選擇對(duì)話框,竟然看到了它默認(rèn)顯示的“DefaultReverseEngineeringStrategy”類了,我在hibernatetools的安裝目錄找來(lái)找去,終于在plugins\org.hibernate.eclipse_3.2.0.beta6\lib\tools下的hibernate-tools.jar中找到了這個(gè)類的影子,用反編譯工具反編譯一下(懶得去網(wǎng)上下源碼了,呵呵)。一個(gè)個(gè)方法名展現(xiàn)在我面前:
    tableToClassName
    columnToPropertyName
    columnToHibernateTypeName
    。。。
    ??? 這不就是在把數(shù)據(jù)庫(kù)相應(yīng)的項(xiàng)映射成java相應(yīng)的項(xiàng)嗎?
    ??? 開(kāi)工!
    ??? 新建一個(gè)類CowNewReverseEngineeringStrategy,繼承自DefaultReverseEngineeringStrategy,override? tableToClassName、
    columnToPropertyName這兩個(gè)方法,在這兩個(gè)方法中寫(xiě)入自己的轉(zhuǎn)換邏輯。
    然后打包成jar包,放到plugins\org.hibernate.eclipse_3.2.0.beta6\lib\tools下,然后在plugins\org.hibernate.eclipse_3.2.0.beta6\lib\tools\MANIFEST.MF中把這個(gè)新增包的內(nèi)容加上,關(guān)閉eclipse,加個(gè)-clean參數(shù)啟動(dòng)eclipse,然后點(diǎn)擊“Hibernate Code Generation”,把“reveng Strategy”填成“com.cownew.DevTools.hibtools.RevEng.CowNewReverseEngineeringStrategy”,“Run”!!!
    暈倒,竟然報(bào)錯(cuò)“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”

    看來(lái)是反射調(diào)用的時(shí)候出了問(wèn)題,重新打開(kāi)hibernate-tools.jar,仔細(xì)觀察,竟然發(fā)現(xiàn)了一個(gè)DelegatingReverseEngineeringStrategy,它多??? 了一個(gè)參數(shù)為“ReverseEngineeringStrategy delegate”的構(gòu)造函數(shù),而其他調(diào)用都是轉(zhuǎn)發(fā)給ReverseEngineeringStrategy了,暈倒,搞不懂它在做什么,也沒(méi)時(shí)間研究了,給CowNewReverseEngineeringStrategy也曾街一個(gè)參數(shù)為“ReverseEngineeringStrategy delegate”的構(gòu)造函數(shù),重新打包,重新啟動(dòng)eclipse,哈哈,一切搞定,終于生成我可愛(ài)的,
    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開(kāi)源團(tuán)隊(duì) 閱讀(1520) 評(píng)論(4)  編輯  收藏

    評(píng)論

    # re: cownew開(kāi)源-給hibernateTools寫(xiě)個(gè)插件 2006-07-17 01:08 原創(chuàng)專欄 開(kāi)源學(xué)習(xí)
    你們太孤陋寡聞了。
    輪子輪子輪子。

    你們這個(gè)團(tuán)隊(duì)?wèi)?yīng)該多考察考察,跟得上時(shí)代。與時(shí)俱進(jìn)呀

    不過(guò)好像hibernate3現(xiàn)在還沒(méi)有這種工具,如果哪位朋友知道有這種工具,希望賜教

    XDoclet
    XDoclet
    XDoclet
    XDoclet
    XDoclet
      回復(fù)  更多評(píng)論
      

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

    # re: cownew開(kāi)源-給hibernateTools寫(xiě)個(gè)插件 2006-07-17 16:44 霉干菜
    @原創(chuàng)專欄 開(kāi)源學(xué)習(xí)

    我覺(jué)得作者說(shuō)的不是XDoclet這個(gè)意思,我估計(jì)他想要達(dá)到的是通過(guò)UML建摸直接通過(guò)工具生成數(shù)據(jù)庫(kù)表,猜測(cè)而已  回復(fù)  更多評(píng)論
      

    # re: cownew開(kāi)源-給hibernateTools寫(xiě)個(gè)插件 2006-07-17 19:47 CowNew開(kāi)源團(tuán)隊(duì)
    感謝各位指教.在公司一直是用公司自己開(kāi)發(fā)的ORMMaping引擎,所以開(kāi)源的ORM工具用的機(jī)會(huì)少一些,hibernate也是去年評(píng)估各個(gè)開(kāi)源ORM工具的優(yōu)劣的時(shí)候簡(jiǎn)單用了一下,所以難免才疏學(xué)淺.
    正如霉干菜說(shuō)的,我真正想要的工具是我畫(huà)類圖就可以了,然后所有的我不關(guān)心的java代碼和配置文件都自動(dòng)生成,這樣能有更多精力投入業(yè)務(wù)開(kāi)發(fā)和整體技術(shù) 業(yè)務(wù)框架的搭建。
    如果再找不到能滿足要求的開(kāi)源工具的話,也許自己寫(xiě)一個(gè)也不錯(cuò),呵呵,先做成codegenerate工具,然后逐步轉(zhuǎn)化成一個(gè)元數(shù)據(jù)驅(qū)動(dòng)的東西,呵呵美極美極,這一直都是我的夢(mèng)想?yún)s沒(méi)時(shí)間去做的東西。  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲人成片在线观看| 67194成手机免费观看| 99久久婷婷国产综合亚洲| 亚洲美女又黄又爽在线观看| 成人永久免费高清| 曰批全过程免费视频播放网站| h片在线播放免费高清| mm1313亚洲国产精品无码试看| 亚洲欧洲日产国码www| 亚洲大尺度无码专区尤物| 成人亚洲网站www在线观看| 成人毛片免费网站| 色欲A∨无码蜜臀AV免费播| 久久九九久精品国产免费直播| 精品国产日韩亚洲一区在线| 亚洲砖码砖专无区2023| 亚洲一级毛片免费看| 亚洲成a人片在线网站| 久久久久亚洲AV成人片| 亚洲国产成人久久精品动漫 | 亚洲狠狠成人综合网| 亚洲精品在线视频观看| 久久精品国产亚洲av高清漫画| 亚洲AV成人一区二区三区AV| 国产亚洲成人久久| 91麻豆精品国产自产在线观看亚洲 | 四虎永久免费地址在线观看| 日韩在线天堂免费观看| 女人张开腿给人桶免费视频| 性xxxx视频播放免费| 国产精品无码免费播放| 色吊丝永久在线观看最新免费| 全免费A级毛片免费看网站| 女人18毛片a级毛片免费| 看全色黄大色大片免费久久| 日韩午夜免费视频| 无码欧精品亚洲日韩一区夜夜嗨 | 亚洲综合色一区二区三区| 亚洲欧美日韩中文二区| 久久精品国产亚洲av品善| 暖暖免费中文在线日本|