EasyDBO是一個(gè)超輕量級的目前只支持單表映射的持久化框架,超輕量意味著入手很簡單,使用很方便,但注意它是單表映射,導(dǎo)致在處理一些映射關(guān)系的時(shí)候要做一些特別的處理。
使用EasyDBO的持久化策略:
一對一
一對一關(guān)系要分為兩種情況,一是主表對從表的映射。如Name(firstName, lastName, midNmae) 表和User表,因?yàn)镋asyDBO只支持單表的映射,如果表的粒度過細(xì),會(huì)導(dǎo)致極細(xì)的領(lǐng)域?qū)ο蟮漠a(chǎn)生,如Name對象的產(chǎn)生,而又需要為這些細(xì)粒度的對象創(chuàng)建CRUD方法,而且EasyDBO沒有象Hibernate那樣的自動(dòng)的關(guān)聯(lián)持久化操作,而且如果不使用Easyjf-dbo.xml來配置的話(即直接使用類實(shí)現(xiàn)IObject接口的話),你甚至不能在User對象中出現(xiàn)Name對象的私有成員申明。所以在這種情況下,最好把Name表和User表融合。二是大表和大表的映射,在這種情況下就只有使用外鍵關(guān)聯(lián)的策略。但同樣要注意,EasyDBO現(xiàn)在還不是一個(gè)完善的持久化框架,我認(rèn)為很重要的一點(diǎn)就是離開了easyjf-dbo.xml的配置來持久化對象,如果直接使用implements IObject(而這是我認(rèn)為最方便簡單的使用途徑,想必用慣了Hibernate轉(zhuǎn)而使用EasyDBO的人都用這種感覺吧)你不能完整的使用OO,即不能在BBSDoc中出現(xiàn)PRivate BBSDir bbsdir;而只能使用private String bbsdir_id。
一對多
一對多(多對一)通過上面的分析,可只在這種情況下,最好還是使用外鍵的關(guān)聯(lián)(多的一方主動(dòng)關(guān)聯(lián)一的一方)。那么在領(lǐng)域類為一的一方中,不能出現(xiàn)XXXSet之類(如果使用配置文件除外)。這樣實(shí)現(xiàn)的就是單向關(guān)聯(lián)。要使用雙向關(guān)聯(lián)的話,就只能為一的一方添加一個(gè)Util類,使用Query方法來得到多的一方的List了。
多對多
多對多的情況是比較復(fù)雜的了。一般的情況是通過建立一個(gè)中間表來管理兩對象的關(guān)系。在EasyDBO中就分兩個(gè)情況了。先舉個(gè)例子:比如User和Role,這是一個(gè)典型的多對多的映射關(guān)系,在用戶權(quán)限管理模型中這種實(shí)現(xiàn)方法很普通。那么對這個(gè)多對多該怎么處理?首先還是要建立一個(gè)User-Role表,這個(gè)是必須的,其次就出現(xiàn)了兩個(gè)情況,一,直接使用User-Role表。這種情況就是說不對User-Role表做任何處理,在UserUtil中建立一個(gè)List getRoles()方法,在該方法中直接使用SQL語句從做一個(gè)兩層的嵌套查詢。這種方法還是不錯(cuò),對于原來就使用JDBC的程序員很熟悉,但比較麻煩而且查找次數(shù)較多。另一個(gè)就是為User-Role表建立一個(gè)UserRole對象,這也是我推薦的做法。建立一個(gè)對象的意思不是說就是一個(gè)單純的建立一個(gè)橋梁對象(我自己就這樣叫那種為只起中間過度作用的表建立的對象),我就想能不能根據(jù)實(shí)際的情況利用好這個(gè)對象。比如在用戶權(quán)限管理界面中我們會(huì)列出某個(gè)用戶的所有權(quán)限或者列出屬于一個(gè)權(quán)限組的所有用戶只類的,那么我門就可以在User-Role表(即UserRole對象中)添加一些冗余字段,如userName, roleNmae等等來方便頁面的合成操作,比如我門可以方便的使用# foreach ( $UserRole in $UserRoleList)… $!UserRole.userName等等來簡化頁面的編寫,而且這樣操作,查詢數(shù)據(jù)庫的次數(shù)會(huì)少很多,而如果使用第一中就比較麻煩了。但要注意的是不能過多的添加字段,畢竟這些是冗余的數(shù)據(jù)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注