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

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

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

    posts - 89,  comments - 98,  trackbacks - 0
    摘自JAVA視線論壇

    POJO = pure old java object or plain ordinary java object or what ever.

    PO = persisent object 持久對象

    就是說在一些Object/Relation Mapping工具中,能夠做到維護數據庫表記錄的persisent object完全是一個符合Java Bean規范的純Java對象,沒有增加別的屬性和方法。全都是這樣子的:


    java代碼:?

    public class User {
    ? private long id;
    ? privateString name;
    ? publicvoid setId(long id){
    this.id = id;
    }?
    publicvoid setName(String name){
    this.name=name;
    }
    public long getId(){
    return id;
    }?
    publicString getName(){
    return name;
    }
    }?



    ---------------------------------------------------------------------------
    首先要區別持久對象和POJO。

    持久對象實際上必須對應數據庫中的entity,所以和POJO有所區別。比如說POJO是由new創建,由GC回收。但是持久對象是insert數據庫創建,由數據庫delete刪除的。基本上持久對象生命周期和數據庫密切相關。另外持久對象往往只能存在一個數據庫Connection之中,Connnection關閉以后,持久對象就不存在了,而POJO只要不被GC回收,總是存在的。

    由于存在諸多差別,因此持久對象PO(Persistent Object)在代碼上肯定和POJO不同,起碼PO相對于POJO會增加一些用來管理數據庫entity狀態的屬性和方法。而ORM追求的目標就是要PO在使用上盡量和POJO一致,對于程序員來說,他們可以把PO當做POJO來用,而感覺不到PO的存在。

    JDO的實現方法是這樣的:
    1、編寫POJO
    2、編譯POJO
    3、使用JDO的一個專門工具,叫做Enhancer,一般是一個命令行程序,手工運行,或者在ant腳本里面運行,對POJO的class文件處理一下,把POJO替換成同名的PO。
    4、在運行期運行的實際上是PO,而不是POJO。

    該方法有點類似于JSP,JSP也是在編譯期被轉換成Servlet來運行的,在運行期實際上運行的是Servlet,而不是JSP。

    Hibernate的實現方法比較先進:
    1、編寫POJO
    2、編譯POJO
    3、直接運行,在運行期,由Hibernate的CGLIB動態把POJO轉換為PO。

    由此可以看出Hibernate是在運行期把POJO的字節碼轉換為PO的,而JDO是在編譯期轉換的。一般認為JDO的方式效率會稍高,畢竟是編譯期轉換嘛。但是Hibernate的作者Gavin King說CGLIB的效率非常之高,運行期的PO的字節碼生成速度非常之快,效率損失幾乎可以忽略不計。

    實際上運行期生成PO的好處非常大,這樣對于程序員來說,是無法接觸到PO的,PO對他們來說完全透明。可以更加自由的以POJO的概念操縱PO。另外由于是運行期生成PO,所以可以支持增量編譯,增量調試。而JDO則無法做到這一點。實際上已經有很多人在抱怨JDO的編譯期Enhancer問題了,而據說JBossDO將采用運行期生成PO字節碼,而不采用編譯期生成PO字節碼。

    另外一個相關的問題是,不同的JDO產品的Enhancer生成的PO字節碼可能會有所不同,可能會影響在JDO產品之間的可移植性,這一點有點類似EJB的可移植性難題。

    -----------------------------------------------------------------------------------
    由這個問題另外引出一個JDO的缺陷。

    由于JDO的PO狀態管理方式,所以當你在程序里面get/set的時候,實際上不是從PO的實例中取values,而是從JDO StateManager中取出來,所以一旦PM關閉,PO就不能進行存取了。

    在JDO中,也可以通過一些辦法使得PO可以在PM外面使用,比如說定義PO是transient的,但是該PO在PM關閉后就沒有PO identity了。無法進行跨PM的狀態管理。

    而Hibernate是從PO實例中取values的,所以即使Session關閉,也一樣可以get/set,可以進行跨Session的狀態管理。

    在分多層的應用中,由于持久層和業務層和web層都是分開的,此時Hibernate的PO完全可以當做一個POJO來用,也就是當做一個VO,在各層間自由傳遞,而不用去管Session是開還是關。如果你把這個POJO序列化的話,甚至可以用在分布式環境中。(不適合lazy loading的情況)

    但是JDO的PO在PM關閉后就不能再用了,所以必須在PM關閉前把PO拷貝一份VO,把VO傳遞給業務層和web層使用。在非分布式環境中,也可以使用ThreadLocal模式確保PM始終是打開狀態,來避免每次必須進行PO到VO的拷貝操作。但是不管怎么說,這總是權宜之計,不如Hibernate的功能強。
    posted on 2006-07-25 09:08 水煮三國 閱讀(367) 評論(0)  編輯  收藏 所屬分類: Hibernate
    <2006年7月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    常用鏈接

    留言簿(4)

    隨筆分類(85)

    隨筆檔案(89)

    文章分類(14)

    文章檔案(42)

    收藏夾(37)

    java

    oracle

    Sybase

    搜索

    •  

    積分與排名

    • 積分 - 210836
    • 排名 - 265

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 波多野结衣中文一区二区免费| 美女裸身网站免费看免费网站| 免费人妻精品一区二区三区| 亚洲av日韩专区在线观看| 成人精品综合免费视频| 香港a毛片免费观看| 日本免费xxxx色视频| 四虎永久在线精品免费观看地址 | 在线观看人成视频免费无遮挡| 99热精品在线免费观看| 国产精品高清全国免费观看| 在线a亚洲v天堂网2019无码| 久久精品国产亚洲av高清漫画| 精品亚洲456在线播放| 曰韩无码AV片免费播放不卡| 免费人妻av无码专区| 一区二区免费电影| 免费AA片少妇人AA片直播| 亚洲精品123区在线观看| 女人18一级毛片免费观看| 亚洲成色WWW久久网站| 亚洲国产午夜精品理论片在线播放 | 日韩在线看片免费人成视频播放| 亚洲中文字幕无码中文字在线| 久久国产精品免费一区二区三区| 国产在线a免费观看| 亚洲国产AV无码一区二区三区| 亚洲成av人片在线观看天堂无码 | 美女18毛片免费视频| 无码少妇一区二区浪潮免费| 精品国产综合成人亚洲区| 又长又大又粗又硬3p免费视频| 国产国拍亚洲精品mv在线观看| 99精品视频在线免费观看| 亚洲色偷偷偷综合网| 最近最好的中文字幕2019免费| 亚洲精品白色在线发布| 麻豆精品不卡国产免费看| 精品国产香蕉伊思人在线在线亚洲一区二区 | 青青视频观看免费99| 深夜久久AAAAA级毛片免费看|