蔡 超
SCEA,SCBCD,MCSD,IBM RUP Specilist
北京天融信軟件架構師
SUN,Microsoft培訓中心特邀高端教師
常年提供架構咨詢服務
chaocai2001@yahoo.com.cn ,010-82776427
問題:
在spring+hibernate的常見架構中,常會應為hibernate的延遲加載遇到一些麻煩。如Hibernate的引入使用脫管領域對象直接取代了DTO,然而前臺組織顯示時常會應為脫管領域對象的一些關系域未被加載而拋出異常(其實延遲加載是優化系統性能的一種有效方式)。
為了使顯示層正常工作,我們就必須在業務層顯式的加載這些表現層會用到的延遲加載的關系域對象。而這樣的工作不僅需要額外的代碼,并且這些代碼往往也與所進行的業務邏輯無關。并且表現層的變化較多這樣一來如果上述代碼進入業務層就會導致業務層跟隨表現層的變化。
解決方案:
在“Spring構建應用系統的最佳架構與模式實踐(1)”中將邏輯層分為了Façade和ApplicationService兩層。
Façade的方法組織是針對客戶端請求的,所以如果我們把業務邏輯封裝在ApplicationService對象中,而把脫管對象產生(包括根據表現層初始化延遲加載對象,關閉Session)。這樣便可以有效的防止表現層邏輯混入業務邏輯中。