POJO(plain ordinary java object) 簡單無規則java對象
簡單的Java對象(Plain Old Java Objects)實際就是普通JavaBeans,使用POJO名稱是為了避免和EJB混淆起來, 而且簡稱比較直接. 其中有一些屬性及其getter setter方法的類,有時可以作為value object或dto(Data Transform Object)來使用.當然,如果你有一個簡單的運算屬性也是可以的,但不允許有業務方法,也不能攜帶有connection之類的方法
說明:可以轉化為PO、DTO、VO。
1、POJO持久化之後==〉PO
(在運行期,由Hibernate中的cglib動態把POJO轉換為PO,PO相對於POJO會增加一些用來管理資料庫entity狀態的屬性和方法。PO對於programmer來說完全透明,由於是運行期產生PO,所以可以支援增量編譯,增量調試。)
2、POJO傳輸過程中==〉DTO
3、POJO用作展示層==〉VO
PO 和VO都應該屬於它。
PO(persistant object) 持久對象 1、有時也被稱為Data對象,對應資料庫中的entity,可以簡單認為一個PO對應資料庫中的一條記錄。
2、在hibernate持久化架構中與insert/delet操作密切相關。
3、PO中不應該包含任何對資料庫的操作。
VO(value object) 值對象 1、主要對應頁面顯示(web頁面/swt、swing介面)的資料對象。
2、可以和表對應,也可以不,這根據業務的需要。
注:在struts中,用ActionForm做VO,需要做一個轉換,因為PO是物件導向的,而ActionForm是和view對應的,要將幾個PO要顯示的屬性合成一個ActionForm,可以使用BeanUtils的copy方法。
BO(business object) 業務對象
封裝商務邏輯為一個對象(可以包括多個PO,通常需要將BO轉化成PO,才能進行資料的持久化,反之,從DB中得到的PO,需要轉化成BO才能在業務層使用)。
關於BO主要有三種概念
1、只包含業務對象的屬性;
2、只包含業務方法;
3、兩者都包含。
在實際使用中,認為哪一種概念正確並不重要,關鍵是實際應用中適合自己項目的需要。
DTO (TO) :Data Transfer Object資料轉送對象
1、用在需要跨進程或遠程傳輸時,它不應該包含商務邏輯。
2、比如一張表有100個欄位,那麼對應的PO就有100個屬性(大多數情況下,DTO內的資料來自多個表)。但view層只需顯示10個欄位,沒有必要把整個PO對象傳遞到client,這時我們就可以用只有這10個屬性的DTO來傳輸資料到client,這樣也不會暴露server端表結構。到達用戶端以後,如果用這個對象來對應介面顯示,那此時它的身份就轉為VO。
DAO(data access object) Data Access Objects
是一個sun的一個標準j2ee設計模式,這個模式中有個介面就是DAO,它負持久層的操作。為業務層提供介面。此對象用於訪問資料庫。通常和PO結合使用,DAO中包含了各種資料庫的操作方法。通過它的方法,結合PO對資料庫進行相關的操作.
1、主要用來封裝對DB的訪問(CRUD操作)。
2、通過接收Business層的資料,把POJO持久化為PO。
PO與VO的區別:
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的屬性是跟資料庫表的欄位一一對應的。
持久化對象(POJO)與PO的區別:
持久對象實際上必須對應資料庫中的entity,所以和POJO有所區別。比如說POJO是由new建立,由GC回收。但是持久對象是insert資料庫建立,由資料庫delete刪除的。基本上持久對象生命週期和資料庫密切相關。另外持久對象往往只能存在一個資料庫Connection之中,Connnection關閉以後,持久對象就不存在了,而POJO只要不被GC回收,總是存在的。
由於存在諸多差別,因此持久對象PO(PersistentObject)在代碼上肯定和POJO不同,起碼PO相對於POJO會增加一些用來管理資料庫entity狀態的屬性和方法。而ORM追求的目標就是要PO在使用上盡量和POJO一致,對於程式員來說,他們可以把PO當做POJO來用,而感覺不到PO的存在。
參考網址:
http://www.iteye.com/topic/243
http://hi.baidu.com/xiaoziyu910/item/99b6e71443173cf8ddeeca6c
http://www.blogjava.net/Jkallen/archive/2006/04/26/43290.html
http://www.blogjava.net/johnnylzb/archive/2010/05/27/321968.html