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

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

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

    posts - 120,  comments - 19,  trackbacks - 0
    ??關于VO、PO的理解


    O/R Mapping 是 Object Relational Mapping(對象關系映射)的縮寫。通俗點講,就是將對象與關系數據庫綁定,用對象來表示關系數據。在O/R Mapping的世界里,有兩個基本的也是重要的東東需要了解,即VO,PO。
      VO,值對象(Value Object),PO,持久對象(Persisent Object),它們是由一組屬性和屬性的get和set方法組成。從結構上看,它們并沒有什么不同的地方。但從其意義和本質上來看是完全不同的。

    1.VO是用new關鍵字創建,由GC回收的。
      PO則是向數據庫中添加新數據時創建,刪除數據庫中數據時削除的。并且它只能存活在一個數據庫連接中,斷開連接即被銷毀。

    2.VO是值對象,精確點講它是業務對象,是存活在業務層的,是業務邏輯使用的,它存活的目的就是為數據提供一個生存的地方。
      PO則是有狀態的,每個屬性代表其當前的狀態。它是物理數據的對象表示。使用它,可以使我們的程序與物理數據解耦,并且可以簡化對象數據與物理數據之間的轉換。

    3.VO的屬性是根據當前業務的不同而不同的,也就是說,它的每一個屬性都一一對應當前業務邏輯所需要的數據的名稱。
      PO的屬性是跟數據庫表的字段一一對應的。

    PO對象需要實現序列化接口。

    (轉載:http://www.matrix.org.cn/resource/article/43/43869.html
    --------------------------------------------
    在 struts+ hibernate 這種結構中,是不應該把Hibernate產生的PO直接傳遞給JSP的,不管他是

    Iterator,還是List,這是一個設計錯誤。

    我來談談在J2EE架構中各層的數據表示方法:

    Web層的數據表示是FormBean,數據來源于HTML Form POST
    業務層的數據表示是VO
    持久層的數據表示是PO,其數據來源于數據庫,持久層的數據表示例如CMP

    在一個規范的J2EE架構中,不同層的數據表示應該被限制在層內,而不應該擴散到其它層,這樣可以降

    低層間的耦合性,提高J2EE架構整體的可維護性和可擴展性。比如說Web層的邏輯進行了修改,那么只需

    要修改FormBean的結構,而不需要觸動業務層和持久層的代碼修改。同樣滴,當數據庫表進行了小的調

    整,那么也只需要修改持久層數據表示,而不需要觸動業務層代碼和Web層代碼。

    不過由于Hibernate的強大功能,例如動態生成PO,PO的狀態管理可以脫離Session,使得在應用了

    Hibernate的J2EE框架中,PO完全可以充當VO,因此我們下面把PO和VO合并,統稱為PO。

    先來談談ActionFormBean和持久層的PO之間的重大區別。

    在簡單的應用中,ActionFormBean和PO幾乎是沒有區別,所以很多人干脆就是用ActionFormBean來充當

    PO,于是ActionFormBean從JSP頁面到Servlet控制層再到業務層,然后穿過持久層,最后一直映射到數

    據庫表。真是一竿子捅到了底!

    但是在復雜的應用中,ActionFormBean和PO是分離的,他們也不可能一樣。ActionFormBean是和網頁里

    面的Form表單一一對應的,Form里面有什么元素,Bean里面就有什么屬性。而PO和數據庫表對應,因此

    如果數據庫表不修改,那么PO也不會修改,如果頁面的流程和數據庫表字段對應關系不一致,那么你又

    如何能夠使用ActionFormBean來取代PO呢?

    比如說吧,用戶注冊頁面要求注冊用戶的基本信息,因此HTML Form里面包含了基本信息屬性,于是你需

    要一個ActionFormBean來一一對應(注意:是一一對應),每個Bean屬性對應一個文本框或者選擇框什么

    的。

    而用戶這個持久對象呢?他的屬性和ActionFormBean有什么明顯不同呢?他會有一些ActionFormBean所

    沒有的集合屬性,比如說用戶的權限屬性,用戶的組屬性,用戶的帖子等等。另外還有可能的是在

    ActionFormBean里面有3個屬性,分別是用戶的First Name, Middle Name, Last Name,而在我的User這

    個持久對象中就是一個 Name 對象屬性。

    假設我的注冊頁面原來只要你提供First Name,那么ActionFormBean就這一個屬性,后來我要你提供全

    名,你要改ActionFormBean,加兩個屬性。但是這個時候PO是不應該修改滴,因為數據庫沒有改。

    那么在一個完整的J2EE系統中應該如何進行合理的設計呢?

    JSP(View) ---> ActionFormBean(Module) ---> Action(Control)

    ActionFormBean是Web層的數據表示,它和HTML頁面Form對應,只要Web頁面的操作流程發生改變,它就

    要相應的進行修改,它不應該也不能被傳遞到業務層和持久層,否則一旦頁面修改,會一直牽連到業務

    層和持久層的大面積的代碼進行修改,對于軟件的可維護性和可擴展性而言,是一個災難,Actiont就是

    他的邊界,到此為止!

    Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB

    而PO則是業務層和持久層的數據表示,它在業務層和持久層之間進行流動,他不應該也不能被傳遞到Web

    層的View中去,而ActionServlet就是他的邊界,到此為止!

    然后來看一看整個架構的流程:

    當用戶通過瀏覽器訪問網頁,提交了一個頁面。于是Action拿到了這個FormBean,他會把FormBean屬性

    讀出來,然后構造一個PO對象,再調用業務層的Bean類,完成了注冊操作,重定向到成功頁面。而業務

    層Bean收到這個PO對象之后,調用DAO接口方法,進行持久對象的持久化操作。

    當用戶查詢某個會員的信息的時候,他用全名進行查詢,于是Action得到一個UserNameFormBean包括了3

    個屬性,分別是first name, middle name, last name,然后Action把UserNameFormBean的3個屬性讀出

    來,構造Name對象,再調用業務Bean,把Name對象傳遞給業務Bean,進行查詢。

    業務Bean取得Name(注意: Name對象只是User的一個屬性)對象之后調用DAO接口,返回一個User的PO對象

    ,注意這個User不同于在Web層使用的UserFormBean,他有很多集合屬性滴。然后業務Bean把User對象返

    回給Action。

    Action拿到User之后,把User的基本屬性取出(集合屬性如果不需要就免了),構造UserFormBean,然后

    把UserFormBean request.setAttribute(...),然后重定向到查詢結果頁面。

    查詢頁面拿到request對象里面的ActionFormBean,自動調用tag顯示之。

    總結:

    FormBean是Web層的數據表示,他不能被傳遞到業務層;PO是持久層的數據表示,在特定情況下,例如

    Hibernate中,他可以取代VO出現在業務層,但是不管PO還是VO都必須限制在業務層內使用,最多到達

    Web層的Control,絕不能被擴散到View去。

    FormBean和PO之間的數據轉化是在Action中進行滴。

    BTW:

    JDO1.x還不能像Hibernate功能這樣強大,PO不能脫離持久層,所以必須在業務層使用VO,因此必須在業

    務層進行大量的VO和PO的轉化操作,相對于Hibernate來說,編程比較煩瑣。

    當然咯,理論是一回事,實際操作也不一定非要這樣干,你可以自行取舍,在實際項目中靈活一點,增

    加一點bad smell,提高開發效率。只不過在大型項目中最好還是嚴絲合縫,不然的話,改版的時候會痛

    苦的很滴。
    (轉載:http://forum.hibernate.org.cn/viewtopic.php?t=627



    posted on 2006-08-16 13:51 阿成 閱讀(533) 評論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 亚洲视频免费一区| 78成人精品电影在线播放日韩精品电影一区亚洲 | 成人性生交大片免费看午夜a| 亚洲精品欧洲精品| 中文字幕视频免费| 亚洲码在线中文在线观看| 97av免费视频| 亚洲一区二区三区无码国产| 在线观看视频免费完整版| 亚洲视频一区二区三区四区| 成人看的午夜免费毛片| 黄色a级免费网站| 国产专区一va亚洲v天堂| 成人电影在线免费观看| 亚洲高清中文字幕综合网| 中国在线观看免费高清完整版| 亚洲女女女同性video| 亚洲精品无码久久久久AV麻豆| 国产高潮流白浆喷水免费A片 | 亚洲av无码精品网站| 久久久久久精品成人免费图片| 亚洲fuli在线观看| 亚洲人成无码网WWW| 久久久久国产精品免费免费不卡 | 国产亚洲漂亮白嫩美女在线| 一级毛片直播亚洲| 你懂得的在线观看免费视频| 亚洲精品在线免费观看视频| 国产青草视频免费观看97| 久久久久久噜噜精品免费直播| 亚洲视频在线免费观看| 美女黄网站人色视频免费国产| 女bbbbxxxx另类亚洲| 亚洲天堂中文资源| 天天看片天天爽_免费播放| 久久精品成人免费国产片小草| 亚洲免费人成视频观看| 亚洲国产精品专区在线观看| 日韩精品内射视频免费观看| 亚洲国产欧美国产综合一区 | 亚洲一区二区三区在线|