PO : persistant object定義
PO(persistant object) 持久對象,通常對應(yīng)數(shù)據(jù)模型(數(shù)據(jù)庫),本身還有部分業(yè)務(wù)邏輯的處理??梢钥闯墒桥c數(shù)據(jù)庫中的表相映射的java對象。最簡單的PO就是對應(yīng)數(shù)據(jù)庫中某個表中的一條記錄,多個記錄可以用PO的集合。PO中應(yīng)該不包含任何對數(shù)據(jù)庫的操作。使用Hibernate來生成PO是不錯的選擇。
VO:value object定義
VO(value object) 值對象,通常用于業(yè)務(wù)層之間的數(shù)據(jù)傳遞,和PO一樣也是僅僅包含數(shù)據(jù)而已。但應(yīng)是抽象出的業(yè)務(wù)對象,可以和表對應(yīng),也可以不,這根據(jù)業(yè)務(wù)的需要。個人覺得同DTO(數(shù)據(jù)傳輸對象),在web上傳遞
VO對象與PO對象異同
PO只能用在數(shù)據(jù)層,VO用在商業(yè)邏輯層和表示層。各層操作屬于該層自己的數(shù)據(jù)對象,這樣就可以降低各層之間的耦合,便于以后系統(tǒng)的維護(hù)和擴(kuò)展。
VO值對象,對應(yīng)頁面表單的屬性值
相同點(diǎn):
都是javabean
不同點(diǎn):
①PO對象中的屬性關(guān)聯(lián)數(shù)據(jù)庫的字段
②VO對象中的屬性可以隨意增加、修改、刪除,對應(yīng)的頁面表單屬性
補(bǔ)充:
一個VO可以只是PO的部分,也可以是多個PO構(gòu)成,同樣也可以等同于一個PO(指的是他們的屬性)。這樣,PO獨(dú)立出來,數(shù)據(jù)持久層也就獨(dú)立出來了,它不會受到任何業(yè)務(wù)的干涉,業(yè)務(wù)邏輯層也獨(dú)立開來,它不會受到數(shù)據(jù)持久層的影響,業(yè)務(wù)層關(guān)心的只是業(yè)務(wù)邏輯的處理,不過,如果我們沒有使用數(shù)據(jù)持久層,或者說沒有使用hibernate,那么PO和VO也可以是同一個東西,雖然這并不好。
VO,值對象(Value Object),PO,持久對象(Persisent Object),它們都是由一組屬性和屬性的get和set方法組成。從結(jié)構(gòu)上看,它們并沒有什么不同的地方。
但從其意義和本質(zhì)上來看是完全不同的:
第一:VO是用new關(guān)鍵字創(chuàng)建,由GC回收的。 PO則是向數(shù)據(jù)庫中添加新數(shù)據(jù)時創(chuàng)建,刪除數(shù)據(jù)庫中數(shù)據(jù)時削除的。且它只能存活在一個數(shù)據(jù)庫連接中,斷開連接即被銷毀。
第二:VO是值對象,精確點(diǎn)講它是業(yè)務(wù)對象,是存活在業(yè)務(wù)層的,是業(yè)務(wù)邏輯使用的,它存活的目的就是為數(shù)據(jù)提供一個生存的地方。PO則是有狀態(tài)的,每個屬性代表其當(dāng)前的狀態(tài)。它是物理數(shù)據(jù)的對象表示。使用它,可以使我們的程序與物理數(shù)據(jù)解耦,并且可以簡化對象數(shù)據(jù)與物理數(shù)據(jù)之間的轉(zhuǎn)換。
第三:VO的屬性是根據(jù)當(dāng)前業(yè)務(wù)的不同而不同的,也就是說,它的每一個屬性都一一對應(yīng)當(dāng)前業(yè)務(wù)邏輯所需要的數(shù)據(jù)的名稱。PO的屬性是跟數(shù)據(jù)庫表的字段一一對應(yīng)的。
TO(shè)(Transfer Object),數(shù)據(jù)傳輸對象,在應(yīng)用程序不同關(guān)系之間傳輸?shù)膶ο蟆?
BO(business object) 業(yè)務(wù)對象,從業(yè)務(wù)模型的角度看,見UML元件領(lǐng)域模型中的領(lǐng)域?qū)ο?。封裝業(yè)務(wù)邏輯的java對象,通過調(diào)用DAO方法,結(jié)合PO,VO進(jìn)行業(yè)務(wù)操作。
POJO(plain ordinary java object) 簡單無規(guī)則java對象純的傳統(tǒng)意義的java對象。就是說在一些Object/Relation Mapping工具中,能夠做到維護(hù)數(shù)據(jù)庫表記錄的persisent object完全是一個符合Java Bean規(guī)范的純Java對象,沒有增加別的屬性和方法。我的理解就是最基本的Java Bean,只有屬性字段及setter和getter方法。
DAO(data access object) 數(shù)據(jù)訪問對象,最主要是訪問數(shù)據(jù)類,一個DAO對應(yīng)一個POJO對象,是一個sun的一個標(biāo)準(zhǔn)j2ee設(shè)計模式,這個模式中有個接口就是DAO,它負(fù)持久層的操作,為業(yè)務(wù)層提供接口,用于訪問數(shù)據(jù)庫,通常和PO結(jié)合使用,DAO中包含了各種數(shù)據(jù)庫的操作方法。通過它的方法,結(jié)合PO對數(shù)據(jù)庫進(jìn)行相關(guān)的操作。夾在業(yè)務(wù)邏輯與數(shù)據(jù)庫資源中間。配合VO, 提供數(shù)據(jù)庫的CRUD操作。
DTO(Data Transfer Object)數(shù)據(jù)傳輸對象,很少用,基本放入到DAO中,只是起到過渡的作用。主要用于遠(yuǎn)程調(diào)用等需要大量傳輸對象的地方。比如我們一張表有100個字段,那么對應(yīng)的PO就有100個屬性。但是我們界面上只要顯示10個字段,客戶端用WEB service來獲取數(shù)據(jù),沒有必要把整個PO對象傳遞到客戶端,這時我們就可以用只有這10個屬性的DTO來傳遞結(jié)果到客戶端,這樣也不會暴露服務(wù)端表結(jié)構(gòu)。到達(dá)客戶端以后,如果用這個對象來對應(yīng)界面顯示,那此時它的身份就轉(zhuǎn)為VO。