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

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

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

    關于POJO及DAO- -

    POJO = pure old Java object POJO有一些private的參數作為對象的屬性。然后針對每個參數定義了get和set方法作為訪問的接口。例如: public class User {

    private long id;

    private String name;

    public void setId(long id) {

    this.id = id;

    }

    public void setName(String name) {

    this.name=name;

    }

    public long getId() {

    return id;

    }

    public String getName() {

    return name;

    }

    }

    POJO對象有時也被稱為Data對象,大量應用于表現現實中的對象。

    取自"

    ?

    ??????????????????????????????????????

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

    PO = persisent object 持久對象

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

    public class User { 
      private long id; 
      private String name;
      public void setId(long id) {
     this.id = id;
    }  
    public void setName(String name) {
    this.name=name;
    } 
     public long getId() {
     return id;
    }  
    public String 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 State Manager?中取出來,所以一旦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的功能強。

    辨別一些名詞:
    1。VO:實際上很模糊,通常指ValueObject和ViewObject
    2. ViewObject,界面展現需要的對象,如Struts的FormBean
    3。Value Object,早期被作為ValueObject和Transfer Object的總稱。實際上Value Object的真正意義在于它的內容,而不是身份
    4。Transfer Object:數據傳輸對象,在應用程序不同層次之間傳書對象,在一個分布式應用程序中,通常可以提高整體的性能
    5。PO:也許就是Persistent Object,基本上就是Entity了
    在不同的體系結構和實現方式里面,這些對象有可能重復,也有可能不重疊。如果你要做一個對所有的體系都能夠方便移植的框架,那么每一種對象都需要嚴格區分。例如JDO的PO不能作為TO,應為它不能脫離PM,譬如你可以選擇用ViewObject(如Struts的FOrmBean)直接作為TO,但在tapestry和Webwork里面就不合適了。但在很多時候,能夠方便實用是最重要的,不要過度設計就是了。

    POJO是這樣一個對象,它是一個普通的Java對象,它不同于EJB這樣的帶有繁重的容器控制功能的對象,它也不是那種被Enhanced過的對象,例如JDO的靜態Enhance,也不是類似Hibernate那樣被動態的byte code generation過。

    也就是說POJO的概念是相對于其他那種被人動過手腳的class而言的,它是沒有被動過手腳的。

    其實,為什么要做DAO?無非是:
    1, 管理connection/transaction (hibernate的話就是session/transaction)
    2, 便于進行統計/log操作;
    3, 便于進行權限控制;

    DAO模式中,有兩類對象,一種是DAO,一種是valueObject。 在我們討論的這個情況中,value object是hibernate對應的POJO.

    那么,按照我的理解,DAO就是一個Transaction包裝器,其邏輯結構就是商業的具體事務。此處,數據庫的transaction和商業的事務是統一的。

    posted on 2007-04-06 22:11 金家寶 閱讀(1947) 評論(0)  編輯  收藏 所屬分類: 其他輔助基礎

    主站蜘蛛池模板: 亚洲午夜一区二区电影院| 亚洲色欲久久久综合网东京热| 亚洲福利视频一区二区三区| 国产精品网站在线观看免费传媒| 亚洲国产精品尤物YW在线观看| 亚洲av成本人无码网站| 国产午夜影视大全免费观看 | 国国内清清草原免费视频99| 亚洲高清中文字幕| 免费国产黄网站在线观看视频| 婷婷亚洲久悠悠色悠在线播放 | 国产尤物在线视精品在亚洲| 永久免费看bbb| 国产偷国产偷亚洲高清人| 免费在线观看视频a| 永久免费无码日韩视频| 色噜噜AV亚洲色一区二区| 在线看片v免费观看视频777| 亚洲综合免费视频| 中文字幕乱码免费视频| 亚洲狠狠色丁香婷婷综合| 在线观看永久免费视频网站| igao激情在线视频免费| 久久夜色精品国产嚕嚕亚洲av| 日本免费大黄在线观看| 亚洲一区二区三区高清不卡| 国产成人免费A在线视频| 天堂亚洲免费视频| 亚洲色图在线播放| 午夜免费福利影院| 国产激情久久久久影院老熟女免费 | 黄网站在线播放视频免费观看| 亚洲精品一级无码中文字幕| 午夜精品一区二区三区免费视频 | 亚洲国产精品VA在线观看麻豆| 亚洲第一网站免费视频| 亚洲日韩精品无码AV海量| 久久久久亚洲AV无码专区桃色| 久久久久久AV无码免费网站下载| 亚洲首页国产精品丝袜| 亚洲日韩国产一区二区三区|