看了一下Web開發(fā)的書,發(fā)現(xiàn)了這些詞。讓我很疑惑。這些詞匯什么意思,又有什么關(guān)系?
看了一些文檔之后,對(duì)它們的基本概念有了最基礎(chǔ)的認(rèn)識(shí)。
POJO:Pure Old Java Object,符合Java Bean屬性規(guī)范的簡(jiǎn)單Java對(duì)象,通常也稱為VO(Value Object,值對(duì)象)。
PO:Persistent Object,持久化對(duì)象。
VO、PO、FormBean之間的區(qū)別:VO是獨(dú)立的Java Object;而PO是Hibernate納入其實(shí)體容器(Entity Map)的對(duì)象。它代表了與數(shù)據(jù)庫中某條記錄相對(duì)應(yīng)的Hibernata實(shí)體,PO的變化在事務(wù)提交時(shí)將反映到實(shí)際的數(shù)據(jù)庫中。FormBean只是HTML中表單的封裝,是為了弱化request中存儲(chǔ)數(shù)據(jù)的作用,將request對(duì)象的get()方法轉(zhuǎn)化為對(duì)象的存取值。
VO和PO在結(jié)構(gòu)上看,沒什么區(qū)別。但從本質(zhì)上看是完全不同的。
VO由new關(guān)鍵字創(chuàng)建,由GC回收。PO則是向數(shù)據(jù)庫中添加新數(shù)據(jù)時(shí)創(chuàng)建,刪除數(shù)據(jù)庫中數(shù)據(jù)時(shí)刪除,并且它只能存活在一個(gè)數(shù)據(jù)庫連接中,斷開連接即被銷毀。
VO是業(yè)務(wù)對(duì)象,由業(yè)務(wù)邏輯使用,它存活的目的就是為數(shù)據(jù)提供一個(gè)生存的地方。PO則是數(shù)據(jù)對(duì)象的表現(xiàn),它可以簡(jiǎn)化對(duì)象數(shù)據(jù)與物理數(shù)據(jù)的轉(zhuǎn)換。
VO的屬性根據(jù)當(dāng)前的業(yè)務(wù)不同而不同。PO的屬性則是跟數(shù)據(jù)庫表的字段一一對(duì)應(yīng)。PO對(duì)象需要實(shí)現(xiàn)序列化接口。
在Hibernate中,最核心的概念就是對(duì)PO的狀態(tài)管理。一個(gè)PO有三種狀態(tài):
1.未被持久化的VO,此時(shí)就是一個(gè)內(nèi)存對(duì)象VO,由JVM管理生命周期。
2.已被持久化的PO,并且在Session生命周期內(nèi),此時(shí)映射數(shù)據(jù)庫連接,由數(shù)據(jù)庫管理生命周期。
3.曾被持久化過,但現(xiàn)在和Session已經(jīng)托管(detached)了,以VO的身份在運(yùn)行。它還可以進(jìn)入另一個(gè)Session,繼續(xù)PO狀態(tài)管理。
需要注意的是, PO最好只在持久層使用,如果脫離持久層到處使用,會(huì)給Hibernate帶來不小的PO對(duì)象維護(hù)開銷。