OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇

          在企業(yè)應(yīng)用中,持久化無疑是其中非常重要的一環(huán),盡管OSGi的規(guī)范中也有負責(zé)持久數(shù)據(jù)、屬性的服務(wù)規(guī)范,但對于企業(yè)應(yīng)用而言那些顯然是不夠的,這里就以目前Java界流行的Hibernate為例來看看如何集成Hibernate到OSGi中,使得我們能夠很簡單在OSGi中使用Hibernate進行持久化。
          首先來看看在傳統(tǒng)的Java應(yīng)用中,是如何使用Hibernate的,在不使用類似spring ORM Template這些封裝了Hibernate東西的情況下,通常都是對外提供一個公共的封裝了通用操作的Dao類,方便其他的Dao或者Service直接使用,在集成到OSGi中仍然希望是如此,那么這步怎么做呢?
          非常的簡單,在Eclipse中新建一個Plugin Project,然后把Hibernate所需要的lib放入project的lib中,將在傳統(tǒng)Java應(yīng)用中的象HibernateUtil、CommonDao這些類直接copy到當(dāng)前project中,CommonDao是需要暴露給其他的Plugin project使用的,這里就需要將CommonDao的package加入到Project的export-package描述中了,接下來就是基于DS的方式對外提供CommonDao服務(wù)。
          通過上面這樣的方法就已經(jīng)可以在基于OSGi的應(yīng)用中使用CommonDao來完成持久化層的操作了,但這時會發(fā)現(xiàn)有個問題,在HibernateUtil這樣的提供session管理的類中通常需要指定hibernatecfg.xml的位置,那么按照上面的做法自然是只能在上面的plugin project中放置這個文件了,在這個文件中配置了需要加載的po的映射文件,這樣呢,就使得目前基于OSGi的應(yīng)用需要將系統(tǒng)中所有的持久PO都放入這個Project中,而不是放入各自獨立的Plugin Project中,而Dao則可以放到各自獨立的Plugin Project中去,基于這樣的方法,就構(gòu)成了在基于OSGi的應(yīng)用中通常是如下的方式:
          Hibernate Bundle.png
          還有一個方法就是每個Plugin Project維護自己的hibernate.cfg.xml,這樣各自的po也就可以放在各自獨立的Plugin project中,但這樣的方法帶來的問題就是各個Plugin project都會產(chǎn)生一個Hibernate SessionFactory,而且當(dāng)系統(tǒng)的持久模型較為復(fù)雜的時候就更麻煩了,一個PO需要存在在幾個Plugin Project中的時候,那樣就會出現(xiàn)session中數(shù)據(jù)不一致的現(xiàn)象,所以暫時不去采用這種方法。
          當(dāng)然,相信將來會有更好的方式,需要解決的主要是統(tǒng)一加載各plugin project中的映射文件、PO的加載,在目前的情況下,要形成一個對外封閉的通用Hibernate Plugin Project還是很麻煩的,這種現(xiàn)象在集成MVC框架等等的時候都是會碰到的,這也反應(yīng)了傳統(tǒng)的開源框架在對于這種真正模塊化的方式上的支撐仍然是非常不夠的,傳統(tǒng)的開源框架更多的停留于概念上的模塊化。

          posted on 2006-09-26 00:32 BlueDavy 閱讀(4515) 評論(12)  編輯  收藏 所屬分類: OSGi、SOA、SCA

          評論

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-26 08:29 壞男孩

          頂一下,有沒有小例子!寫文檔的時候用畫圖的方式很好  回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-26 09:18 螞蚱

          我覺得將所有PO和影射文件放入一個bundle有些不妥。而應(yīng)該使用類似于Http Service的設(shè)計思路,將影射文件或hibernatecfg.xml注冊到一個統(tǒng)一的Hibernate Service 中,但我還沒有細想,如果有時間我會仔細考慮一下,寫個blog與大家共享。  回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-26 14:26 BlueDavy

          @螞蚱
          如果只是hibernate.cfg.xml的問題就好辦了,你有沒有考慮如果po放在各自bundle的時候那怎么去加載那些po呢,固然,不要忘了在OSGi中bundle中的類是獨立加載的,這個和傳統(tǒng)模式是完全不一樣的。
          不過你說的用統(tǒng)一的Hibernate Service的方法確實是可以的,不過要基于Hibernate做出一些改動,特別是在加載po class以及映射文件方面。
          其實對于采用分層開發(fā)的團隊來講這不是問題。  回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-27 20:38 deardream

          不知道OSGI能否處理Hibernate中一個很麻煩的問題:動態(tài)屬性變化?

          運行期給某個PO類添加一個property,級聯(lián)的在某表中增加一個字段。。。

          以前似乎是比較麻煩,除非自己弄個classLoader,現(xiàn)在通過OSGI是否能解決這個問題?  回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-27 20:43 BlueDavy

          @deardream
          ...這個和是否使用OSGi沒關(guān)系,是Hibernate本身的問題...
          當(dāng)然,我們可以在OSGi+Hibernate的基礎(chǔ)上做個擴展來支持這樣的動態(tài)性。  回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 11:43 deardream

          這確實是Hibernate的問題,Hibernate也給出了Dynamic Model來解決這個問題,但是Dynamic Model就破壞了面向?qū)ο蟮暮芏鄡?yōu)勢(聚合、繼承),而如果用靜態(tài)對象的手段,又面向動態(tài)屬性變化的問題。

          我期望的是依賴OSGI來解決運行期對象動態(tài)改變和加載的問題。  回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 12:30 BlueDavy

          @deardream
          嗯,沒錯,可以基于OSGi的思想做個Hibernate的擴展..
            回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 13:06 guitarpoet

          OSGI的環(huán)境就是一個非常經(jīng)典的SOA環(huán)境,把思路限制在O/R Mapping身上就錯了。

          完全可以采用別的方式,我舉兩個:

          1、采用ActiveRecord模式,中間需要一個從Domain Object到Active Record的數(shù)據(jù)遷移。
          2、采用AOP的模式,在持久化操作時給Domain Object mixin持久化操作。

          有趣的是OSGI只知道你是Service,根本不會管你到底是什么。那么,就可以讓腳本語言出馬啦。

          如果再結(jié)合Annotation,可以實現(xiàn)腳本動態(tài)交織,能達到的效果是不可想象的。更有趣的是,這樣在理論上并不會比Hibernate的動態(tài)解析HQL然后生成SQL效率低。而且,我個人覺得用MixIn的方式更面向?qū)ο蟆?

          我現(xiàn)在就有這樣作的打算,我的初步想法是通過JRuby和OSGI把ActiveRecord這種模式以Service的方式實現(xiàn),有想法的話可以跟我討論。
          Mail: guitarpoet@gmail.com  回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 13:38 螞蚱

          @BlueDavy

          我想過這個問題,但是Httpservice中注冊的Servlet不也是在其他bundle中嗎。是否因為Httpservice是系統(tǒng)服務(wù),所以他可以調(diào)用其他bundle中的servlet和相關(guān)類。由于是從你的系列文章中學(xué)的osgi,研究不深,還請多多指教。  回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-09-28 16:09 BlueDavy

          @guitarpoet
          ...我沒有說僅限于O/R Mapping,只是以Hibernate來舉個例子而已....
          每個公司都有其穩(wěn)定的一種持久的方案,總不能強制別人用Hibernate的就一定要用你的方案呀...

          @螞蚱
          ...HttpService的處理機制不同,因為在注冊servlet時是直接把servlet實例給注冊過去的,而在Hibernate那邊則不能這樣...  回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-11-08 15:46 生與夏花

          如果借用Equniox的強大的擴展點機制是不是可以容易點。
          1 。修改hibernate的配置文件加載機制,讓他從registry中動態(tài)的加載配置.
          2 。修改hiberante的hibernate.cfg.xml配置文件加載機制讓他可以從Config Admin中存取做到動態(tài)的配置。
          3 。修改equniox的classLoader加載機制,讓他可以從client端的bundler中加載類或者文件。這個可以參考spring-osgi中的classLoader加載機制。
          4 。這樣就可以以模塊化的方法進行設(shè)計hibernate,每個domain對象和對應(yīng)的映射文件都可以放在獨立的bundler中,把這個bundler作為第一部中hibernate的Extension points加以配置。
          注:如果不想利用equniox的擴展點機制,可以使用 “BlueDavy ”在他blog中提到的可以自己實現(xiàn)一個擴展點模型的實現(xiàn)。
          這個實現(xiàn)如果是jboss的事項者來做應(yīng)該是很簡單的,如果是個人拿就得研究一下hibernate的原代碼了,但是也不用全研究制止配置部分。

            回復(fù)  更多評論   

          # re: OSGi應(yīng)用于企業(yè)應(yīng)用Step by step之持久篇 2006-11-08 17:23 BlueDavy

          @生與夏花
          嗯,沒錯,做法確實差不多是這樣..
          不過既然現(xiàn)在spring & osgi要出來了,可以看看是不是可以直接用
            回復(fù)  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

          <2006年9月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          統(tǒng)計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 永春县| 翁牛特旗| 新津县| 高清| 洛南县| 莱芜市| 安阳县| 蒲城县| 明光市| 临高县| 土默特右旗| 鲁甸县| 怀仁县| 年辖:市辖区| 保靖县| 德江县| 玉溪市| 丁青县| 开阳县| 申扎县| 泸水县| 板桥市| 麻阳| 丁青县| 保康县| 唐海县| 千阳县| 江口县| 东阳市| 富宁县| 福州市| 唐海县| 德安县| 黄大仙区| 汕尾市| 新绛县| 吴川市| 泾阳县| 健康| 临海市| 东平县|