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