J2EE之巔

           

          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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊(cè)

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 明光市| 林周县| 南通市| 平舆县| 镇康县| 沂水县| 太仆寺旗| 师宗县| 鹿邑县| 台北市| 怀远县| 同仁县| 陈巴尔虎旗| 治县。| 平果县| 百色市| 咸丰县| 天全县| 岐山县| 桂平市| 阿瓦提县| 交城县| 合作市| 论坛| 铜梁县| 广宁县| 南城县| 竹北市| 陆良县| 屏南县| 北辰区| 济源市| 吴堡县| 信阳市| 察哈| 衡水市| 巴彦淖尔市| 宽甸| 呼伦贝尔市| 鄱阳县| 宜章县|