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

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

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

    關(guān)于POJO及DAO- -

    POJO = pure old Java object POJO有一些private的參數(shù)作為對(duì)象的屬性。然后針對(duì)每個(gè)參數(shù)定義了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對(duì)象有時(shí)也被稱為Data對(duì)象,大量應(yīng)用于表現(xiàn)現(xiàn)實(shí)中的對(duì)象。

    取自"

    ?

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

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

    PO = persisent object 持久對(duì)象

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

    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;
    }
    }  
    

    首先要區(qū)別持久對(duì)象和POJO。

    持久對(duì)象實(shí)際上必須對(duì)應(yīng)數(shù)據(jù)庫(kù)中的entity,所以和POJO有所區(qū)別。比如說POJO是由new創(chuàng)建,由GC回收。但是持久對(duì)象是insert數(shù)據(jù)庫(kù)創(chuàng)建,由數(shù)據(jù)庫(kù)delete刪除的。基本上持久對(duì)象生命周期和數(shù)據(jù)庫(kù)密切相關(guān)。另外持久對(duì)象往往只能存在一個(gè)數(shù)據(jù)庫(kù)Connection之中,Connnection關(guān)閉以后,持久對(duì)象就不存在了,而POJO只要不被GC回收,總是存在的。

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

    JDO的實(shí)現(xiàn)方法是這樣的:

    1、編寫POJO

    2、編譯POJO

    3、使用JDO的一個(gè)專門工具,叫做Enhancer,一般是一個(gè)命令行程序,手工運(yùn)行,或者在ant腳本里面運(yùn)行,對(duì)POJO的class文件處理一下,把POJO替換成同名的PO。

    4、在運(yùn)行期運(yùn)行的實(shí)際上是PO,而不是POJO。

    該方法有點(diǎn)類似于JSP,JSP也是在編譯期被轉(zhuǎn)換成Servlet來運(yùn)行的,在運(yùn)行期實(shí)際上運(yùn)行的是Servlet,而不是JSP。

    Hibernate的實(shí)現(xiàn)方法比較先進(jìn):

    1、編寫POJO

    2、編譯POJO

    3、直接運(yùn)行,在運(yùn)行期,由Hibernate的CGLIB動(dòng)態(tài)把POJO轉(zhuǎn)換為PO。

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

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

    另外一個(gè)相關(guān)的問題是,不同的JDO產(chǎn)品的Enhancer生成的PO字節(jié)碼可能會(huì)有所不同,可能會(huì)影響在JDO產(chǎn)品之間的可移植性,這一點(diǎn)有點(diǎn)類似EJB的可移植性難題。


    由這個(gè)問題另外引出一個(gè)JDO的缺陷。

    由于JDO的PO狀態(tài)管理方式,所以當(dāng)你在程序里面get/set的時(shí)候,實(shí)際上不是從PO的實(shí)例中取values,而是從JDO State Manager?中取出來,所以一旦PM關(guān)閉,PO就不能進(jìn)行存取了。

    在JDO中,也可以通過一些辦法使得PO可以在PM外面使用,比如說定義PO是transient的,但是該P(yáng)O在PM關(guān)閉后就沒有PO identity了。無法進(jìn)行跨PM的狀態(tài)管理。

    而Hibernate是從PO實(shí)例中取values的,所以即使Session關(guān)閉,也一樣可以get/set,可以進(jìn)行跨Session的狀態(tài)管理。

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

    但是JDO的PO在PM關(guān)閉后就不能再用了,所以必須在PM關(guān)閉前把PO拷貝一份VO,把VO傳遞給業(yè)務(wù)層和web層使用。在非分布式環(huán)境中,也可以使用ThreadLocal模式確保PM始終是打開狀態(tài),來避免每次必須進(jìn)行PO到VO的拷貝操作。但是不管怎么說,這總是權(quán)宜之計(jì),不如Hibernate的功能強(qiáng)。

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

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

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

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

    DAO模式中,有兩類對(duì)象,一種是DAO,一種是valueObject。 在我們討論的這個(gè)情況中,value object是hibernate對(duì)應(yīng)的POJO.

    那么,按照我的理解,DAO就是一個(gè)Transaction包裝器,其邏輯結(jié)構(gòu)就是商業(yè)的具體事務(wù)。此處,數(shù)據(jù)庫(kù)的transaction和商業(yè)的事務(wù)是統(tǒng)一的。

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

    主站蜘蛛池模板: 国产jizzjizz视频全部免费| 毛片高清视频在线看免费观看| 久久99亚洲综合精品首页| 亚洲乱亚洲乱妇24p| 国内一级一级毛片a免费| 亚洲色成人四虎在线观看| 最近中文字幕mv免费高清电影| 亚洲综合无码一区二区三区| h视频在线观看免费完整版| 久久久无码精品亚洲日韩蜜桃 | 18观看免费永久视频| 亚洲视频在线观看网址| 成人免费福利视频| 91在线亚洲综合在线| 免费观看大片毛片| 四虎影视久久久免费观看| 亚洲综合久久夜AV | 久久WWW色情成人免费观看| 亚洲一卡2卡3卡4卡乱码 在线 | 又硬又粗又长又爽免费看| 国产亚洲老熟女视频| 久久黄色免费网站| 91亚洲视频在线观看| 麻豆国产人免费人成免费视频| 污视频网站免费观看| 亚洲AV无码国产丝袜在线观看 | jizzjizz亚洲日本少妇| www.91亚洲| 亚洲精品无码成人| 亚洲女同成人AⅤ人片在线观看 | 亚洲精品伊人久久久久| 国产一区二区三区免费在线观看| 二区久久国产乱子伦免费精品| 亚洲一区免费观看| 午夜精品在线免费观看| 一级毛片试看60分钟免费播放| 亚洲国产成人一区二区三区 | 四虎精品免费永久免费视频| 亚洲综合AV在线在线播放| 67194熟妇在线永久免费观看| 国产亚洲精品免费|