云下的天空

          堅持 隨心而動 走自己的路

           

          POJO 與 PO的 概念

          原文轉(zhuǎn)載自:

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

          PO = persisent object 持久對象 

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


          Java代碼  收藏代碼
          1. public class User {   
          2.   private long id;   
          3.   private String name;  
          4.   public void setId(long id); {  
          5.  this.id = id;  
          6. }    
          7. public void setName(String name); {  
          8. this.name=name;  
          9. }   
          10.  public long getId(); {  
          11.  return id;  
          12. }    
          13. public String getName(); {   
          14. return name;  
          15. }  
          16. }    


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

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

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

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

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

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

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

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

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

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

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

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

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

          在分多層的應(yīng)用中,由于持久層和業(yè)務(wù)層和web層都是分開的,此時Hibernate的PO完全可以當做一個POJO來用,也就是當做一個VO,在各層間自由傳遞,而不用去管Session是開還是關(guān)。如果你把這個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),來避免每次必須進行PO到VO的拷貝操作。但是不管怎么說,這總是權(quán)宜之計,不如Hibernate的功能強。

          posted on 2011-06-02 18:14 天空布藍 閱讀(243) 評論(0)  編輯  收藏 所屬分類: MyBatis


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


          網(wǎng)站導航:
          相關(guān)文章:
           

          導航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          Flex學習鏈接

          搜索

          •  

          最新評論

          • 1.?re: tomcat7的配置
          • 新建變量名: TOMCAT_HOME 應(yīng)該為CATALINA_HOME
          • --houkai
          • 2.?re: tomcat7的配置
          • 確實是的@寒澈
          • --houkai
          • 3.?re: tomcat7的配置
          • @ftp123
            你娘里個大雪碧 里面會有common這個文件夾嗎 不知道還尼瑪在這瞎比比 純尼瑪誤導人 我最惡心的就是這樣沒事裝逼的人 艸
          • --cao
          • 4.?re: tomcat7的配置
          • 從哪抄來的,是抄的,你也說聲啊,要不自己測試下也可以,害人測試半天。
          • --ftp123
          • 5.?re: tomcat7的配置
          • %TOMCAT_HOME%\common\lib 從tomcat6.0開始已經(jīng)沒有common文件夾了,直接用\lib,害我找了半天common文件夾啊,趕快改過來吧
          • --寒澈

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 当雄县| 密山市| 神农架林区| 镇平县| 临高县| 辉南县| 吉木乃县| 辽宁省| 衢州市| 绥阳县| 蒙自县| 洛南县| 息烽县| 海原县| 永德县| 绥阳县| 浮梁县| 新安县| 济宁市| 阜城县| 沧州市| 临洮县| 宁乡县| 承德市| 西峡县| 门头沟区| 榆中县| 恩平市| 高碑店市| 当雄县| 新巴尔虎左旗| 海淀区| 化德县| 黑水县| 高阳县| 新巴尔虎右旗| 洞口县| 阳朔县| 仁寿县| 广汉市| 江川县|