Facade與邊界控制
多層結(jié)構(gòu)是J2EE應(yīng)用開發(fā)的基本模式,很多開發(fā)者都會(huì)按照多層結(jié)構(gòu)來(lái)組織自己的應(yīng)用(通常分為Facade,Application Service,DAO等層),但是他們往往會(huì)選擇在不同層上去控制事務(wù)和Hibernate Session的邊界,可千萬(wàn)不要小看這樣的選擇它會(huì)大大影響程序的可維護(hù)性和可復(fù)用性。
其實(shí)在Facade層來(lái)控制事務(wù)的邊界通常都是最佳選擇。我們知道Facade層的粗粒度接口是直接為用戶請(qǐng)求提供相應(yīng)服務(wù)的,在典型的J2EE環(huán)境中通常使用Session Bean來(lái)實(shí)現(xiàn)Facade層,并且使用CMT。這時(shí)如果有的開發(fā)人員在其他層次控制了事務(wù)如DAO,由于這些層次通常不會(huì)采用EJB實(shí)現(xiàn),所以所使用的事務(wù)為容器提供的用戶管理事務(wù),根據(jù)EJB的事務(wù)規(guī)范CMT是無(wú)法把事務(wù)上下文傳遞到用戶管理事務(wù)的邊界中的,由于J2EE并不支持事務(wù)的嵌套,所以當(dāng)來(lái)自Facade的CMT事務(wù)遇見DAO的事務(wù)時(shí),內(nèi)部事務(wù)將被掛起,這樣整個(gè)事務(wù)的情況,就會(huì)和設(shè)想的業(yè)務(wù)邏輯產(chǎn)生很大的差異。
并且有時(shí)不同業(yè)務(wù)邏輯的實(shí)現(xiàn)會(huì)復(fù)用DAO提供多個(gè)方法,所以很難控制事務(wù)的邊界,導(dǎo)致這些方法難以被復(fù)用。
對(duì)于Hibernate Session,由于存在懶加載的問(wèn)題,所以開發(fā)人員常會(huì)預(yù)見這樣的異常LazyInitializationException。避免這個(gè)問(wèn)題就要求在關(guān)閉session前要裝載好要使用的對(duì)象關(guān)系域。而這種邏輯通常只與界面顯示內(nèi)容相關(guān),如果把session的邊界控制放置在DAO或者Application Service中就會(huì)使業(yè)務(wù)邏輯的實(shí)現(xiàn)要和界面顯示邏輯混合在一起,我們必須在這些方法中加載那些界面顯示需要的對(duì)象關(guān)系域。而界面顯示是經(jīng)常變化的,并且業(yè)務(wù)邏輯會(huì)被多個(gè)不同的界面所復(fù)用,如果這樣Application Service,DAO中方法的復(fù)用性就會(huì)大大降低。
把這些工作放在離表現(xiàn)層最近的Facade中便可以避免這些問(wèn)題。
注意在其他層次中我們不需要控制session的邊界,我們通常采用getCurrentSession()來(lái)獲得當(dāng)前事務(wù)中的session,記住這個(gè)方法必須在事務(wù)上下文存在的情況下才可以調(diào)用,并且在事務(wù)被提交的時(shí)候Hibernate會(huì)在自動(dòng)關(guān)閉session,所以我們不要顯示的關(guān)閉session.
posted on 2007-10-26 10:00 超越巔峰 閱讀(1322) 評(píng)論(0) 編輯 收藏 所屬分類: Java EE